Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将选择更改为ListView后,如何在新的非模式窗口中更新数据?_C#_Wpf_Xaml - Fatal编程技术网

C# 将选择更改为ListView后,如何在新的非模式窗口中更新数据?

C# 将选择更改为ListView后,如何在新的非模式窗口中更新数据?,c#,wpf,xaml,C#,Wpf,Xaml,我在主窗口中有一个用户列表。按下预览按钮后,将打开用于数据编辑的非模式窗口。在主窗口中实时更改更新的数据。问题是如何绑定窗口,因为用户从主窗口中的列表中更改,所以他在已经打开的非模式窗口中实时更改。在用注释一个接一个的问题之后,问题是您的代码设计得不好。通过使用数据绑定(WPF的主要优点之一),您可以不再追根究底地试图找出如何在数据更改时更新一个UI。下面是代码的简化版本,它将始终确保UI与您希望操作的数据相匹配 main window.xaml <Grid Margin=&quo

我在主窗口中有一个用户列表。按下预览按钮后,将打开用于数据编辑的非模式窗口。在主窗口中实时更改更新的数据。问题是如何绑定窗口,因为用户从主窗口中的列表中更改,所以他在已经打开的非模式窗口中实时更改。

在用注释一个接一个的问题之后,问题是您的代码设计得不好。通过使用数据绑定(WPF的主要优点之一),您可以不再追根究底地试图找出如何在数据更改时更新一个UI。下面是代码的简化版本,它将始终确保UI与您希望操作的数据相匹配

main window.xaml

    <Grid Margin="3">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <Label Margin="3" Grid.ColumnSpan="3">Lista użytkowników</Label>
        <Button Margin="3" Padding="3" Grid.Row="2" Grid.ColumnSpan="3" Click="Zamknij_Click">Zamknij</Button>
        <StackPanel Margin="3" Grid.Column="2" Grid.Row="1">
            <!--<Button Name="Dodaj" Click="Dodaj_Click" Margin="3" Padding="10,3" >Dodaj...</Button>-->
            <!--<Button Name="Usun" IsEnabled="False" Click="Usun_Click" Margin="3" Padding="10,3" >Usuń</Button>-->
            <!--<Button Name="Edytuj" IsEnabled="False" Click="Edytuj_Click" Margin="3" Padding="10,3" >Edytuj...</Button>-->
            <Button Name="Podglad" IsEnabled="False" Click="Podglad_Click" Margin="3" Padding="10,3" >Podgląd...</Button>
        </StackPanel>
        <ListView SelectionMode="Single" SelectionChanged="Selection_Changed" Name="lv_uzytkownicy" Margin="3" Grid.Row="1">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Imię"
                            DisplayMemberBinding="{Binding Imie}"/>
                        <GridViewColumn Header="Nazwisko"
                            DisplayMemberBinding="{Binding Nazwisko}" />
                        <GridViewColumn Header="Mail"
                            DisplayMemberBinding="{Binding Mail}"/>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

        <GridSplitter Grid.Column="1" Grid.Row="1" Width="5" ResizeDirection="Columns" HorizontalAlignment="Center"/>
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Label Margin="3">Imię</Label>
        <Label Margin="3" Grid.Row="1">Nazwisko</Label>
        <Label Margin="3" Grid.Row="2">Email</Label>
        <TextBox Name="imieTextBox" Text="{Binding Imie, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1"/>
        <TextBox Name="nazwiskoTextBox" Text="{Binding Nazwisko, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1" Grid.Row="1"/>
        <TextBox Name="mailTextBox" Text="{Binding Mail, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1" Grid.Row="2"/>
        <Grid HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="3" Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="pierwsza" />
            </Grid.ColumnDefinitions>
            <Button Margin="3" Padding="20, 5" Name="Podglad" Click="Podglad_Click" IsDefault="True">Zamknij</Button>
        </Grid>
    </Grid>
Uzytkownik.cs

using System.Collections.ObjectModel;

    public partial class MainWindow : Window
    {
        public ObservableCollection<Uzytkownik> listaUzytkownikow = new ObservableCollection<Uzytkownik>();
        Podglad_Uzytkownika podgladUzytkownika;
        public MainWindow()
        {
            InitializeComponent();
            lv_uzytkownicy.ItemsSource = listaUzytkownikow;
            listaUzytkownikow.Add(new Uzytkownik("Mietek", "Żul", "sikalafa@wp.pl"));
            listaUzytkownikow.Add(new Uzytkownik("Franek", "Alpinista", "halo@gmail.pl"));
            listaUzytkownikow.Add(new Uzytkownik("Stefan", "Ulążka", "mam.to@o2.pl"));
            this.DataContext = this;
        }

        private void Podglad_Click(object sender, RoutedEventArgs e)
        {
            podgladUzytkownika = new Podglad_Uzytkownika();
            podgladUzytkownika.DataContext = lv_uzytkownicy.SelectedItem;
            podgladUzytkownika.Show();
        }

        private void Zamknij_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void Selection_Changed(object sender, SelectionChangedEventArgs e)
        {
            if (lv_uzytkownicy.SelectedItems.Count > 0) Podglad.IsEnabled = true;
            else Podglad.IsEnabled = false;

            if (podgladUzytkownika != null && podgladUzytkownika.IsVisible)
            {
                podgladUzytkownika.DataContext = lv_uzytkownicy.SelectedItem;
            }
        }
    }
    public partial class Podglad_Uzytkownika : Window
    {
        public Podglad_Uzytkownika()
        {
            InitializeComponent();
        }

        private void Podglad_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
    public class Uzytkownik : INotifyPropertyChanged
    {
        private string imie;
        private string nazwisko;
        private string mail;

        public Uzytkownik(string imie, string nazwisko, string mail)
        {
            this.Imie = imie;
            this.Nazwisko = nazwisko;
            this.Mail = mail;
        }

        public string Imie { get => this.imie; set { this.imie = value; OnPropertyChanged(); } }
        public string Nazwisko { get => this.nazwisko; set { this.nazwisko = value; OnPropertyChanged(); } }
        public string Mail { get => this.mail; set { this.mail = value; OnPropertyChanged(); } }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

在用注释一个接一个地追问问题之后,问题是您的代码设计得不好。通过使用数据绑定(WPF的主要优点之一),您可以不再追根究底地试图找出如何在数据更改时更新一个UI。下面是代码的简化版本,它将始终确保UI与您希望操作的数据相匹配

main window.xaml

    <Grid Margin="3">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <Label Margin="3" Grid.ColumnSpan="3">Lista użytkowników</Label>
        <Button Margin="3" Padding="3" Grid.Row="2" Grid.ColumnSpan="3" Click="Zamknij_Click">Zamknij</Button>
        <StackPanel Margin="3" Grid.Column="2" Grid.Row="1">
            <!--<Button Name="Dodaj" Click="Dodaj_Click" Margin="3" Padding="10,3" >Dodaj...</Button>-->
            <!--<Button Name="Usun" IsEnabled="False" Click="Usun_Click" Margin="3" Padding="10,3" >Usuń</Button>-->
            <!--<Button Name="Edytuj" IsEnabled="False" Click="Edytuj_Click" Margin="3" Padding="10,3" >Edytuj...</Button>-->
            <Button Name="Podglad" IsEnabled="False" Click="Podglad_Click" Margin="3" Padding="10,3" >Podgląd...</Button>
        </StackPanel>
        <ListView SelectionMode="Single" SelectionChanged="Selection_Changed" Name="lv_uzytkownicy" Margin="3" Grid.Row="1">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Imię"
                            DisplayMemberBinding="{Binding Imie}"/>
                        <GridViewColumn Header="Nazwisko"
                            DisplayMemberBinding="{Binding Nazwisko}" />
                        <GridViewColumn Header="Mail"
                            DisplayMemberBinding="{Binding Mail}"/>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

        <GridSplitter Grid.Column="1" Grid.Row="1" Width="5" ResizeDirection="Columns" HorizontalAlignment="Center"/>
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Label Margin="3">Imię</Label>
        <Label Margin="3" Grid.Row="1">Nazwisko</Label>
        <Label Margin="3" Grid.Row="2">Email</Label>
        <TextBox Name="imieTextBox" Text="{Binding Imie, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1"/>
        <TextBox Name="nazwiskoTextBox" Text="{Binding Nazwisko, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1" Grid.Row="1"/>
        <TextBox Name="mailTextBox" Text="{Binding Mail, UpdateSourceTrigger=PropertyChanged}" Margin="3" Grid.Column="1" Grid.Row="2"/>
        <Grid HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="3" Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="pierwsza" />
            </Grid.ColumnDefinitions>
            <Button Margin="3" Padding="20, 5" Name="Podglad" Click="Podglad_Click" IsDefault="True">Zamknij</Button>
        </Grid>
    </Grid>
Uzytkownik.cs

using System.Collections.ObjectModel;

    public partial class MainWindow : Window
    {
        public ObservableCollection<Uzytkownik> listaUzytkownikow = new ObservableCollection<Uzytkownik>();
        Podglad_Uzytkownika podgladUzytkownika;
        public MainWindow()
        {
            InitializeComponent();
            lv_uzytkownicy.ItemsSource = listaUzytkownikow;
            listaUzytkownikow.Add(new Uzytkownik("Mietek", "Żul", "sikalafa@wp.pl"));
            listaUzytkownikow.Add(new Uzytkownik("Franek", "Alpinista", "halo@gmail.pl"));
            listaUzytkownikow.Add(new Uzytkownik("Stefan", "Ulążka", "mam.to@o2.pl"));
            this.DataContext = this;
        }

        private void Podglad_Click(object sender, RoutedEventArgs e)
        {
            podgladUzytkownika = new Podglad_Uzytkownika();
            podgladUzytkownika.DataContext = lv_uzytkownicy.SelectedItem;
            podgladUzytkownika.Show();
        }

        private void Zamknij_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void Selection_Changed(object sender, SelectionChangedEventArgs e)
        {
            if (lv_uzytkownicy.SelectedItems.Count > 0) Podglad.IsEnabled = true;
            else Podglad.IsEnabled = false;

            if (podgladUzytkownika != null && podgladUzytkownika.IsVisible)
            {
                podgladUzytkownika.DataContext = lv_uzytkownicy.SelectedItem;
            }
        }
    }
    public partial class Podglad_Uzytkownika : Window
    {
        public Podglad_Uzytkownika()
        {
            InitializeComponent();
        }

        private void Podglad_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
    public class Uzytkownik : INotifyPropertyChanged
    {
        private string imie;
        private string nazwisko;
        private string mail;

        public Uzytkownik(string imie, string nazwisko, string mail)
        {
            this.Imie = imie;
            this.Nazwisko = nazwisko;
            this.Mail = mail;
        }

        public string Imie { get => this.imie; set { this.imie = value; OnPropertyChanged(); } }
        public string Nazwisko { get => this.nazwisko; set { this.nazwisko = value; OnPropertyChanged(); } }
        public string Mail { get => this.mail; set { this.mail = value; OnPropertyChanged(); } }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
  • WPF不建议直接在xaml.cs中编码业务逻辑 档案
  • 建议您使用MVVM模式编写代码
视图模型

public class podgladUzytkownika : INotifyPropertyChanged
{
    private string imie;
    private string nazwisko;
    private string mail;

    public string Mail
    {
        get => mail;
        set => this.SetValue(ref mail, value);
    }
    public string Nazwisko
    {
        get => nazwisko;
        set => this.SetValue(ref nazwisko, value);
    }
    public string Imie
    {
        get => imie;
        set => this.SetValue(ref imie, value);
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void SetValue<T>(ref T oldValue, T newValue, [CallerMemberName] string propertyName = null)
    {
        oldValue = newValue;
        OnPropertyChanged(propertyName);
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}


public class MainWindowViewModel
{
    private int refreshCount;

    public ICommand RefreshCommand { get; }

    public ICommand PodgladUzytkownikaShow { get; }

    public podgladUzytkownika data { get; }

    public MainWindowViewModel()
    {
        data = new podgladUzytkownika();
        PodgladUzytkownikaShow = new Command(PodgladUzytkownikaShowExecute);
        RefreshCommand = new Command(RefreshCommandExecute);
    }

    private void PodgladUzytkownikaShowExecute(object obj)
    {
        var window = new Window();
        window.DataContext = data;
        window.Show();
    }

    private void RefreshCommandExecute(object obj)
    {
        // Data updates are passed to the view
        refreshCount++;
        data.Imie = nameof(data.Imie) + refreshCount;
        data.Nazwisko = nameof(data.Nazwisko) + refreshCount;
        data.Mail = nameof(data.Mail) + refreshCount;
    }
}
  • WPF不建议直接在xaml.cs中编码业务逻辑 档案
  • 建议您使用MVVM模式编写代码
视图模型

public class podgladUzytkownika : INotifyPropertyChanged
{
    private string imie;
    private string nazwisko;
    private string mail;

    public string Mail
    {
        get => mail;
        set => this.SetValue(ref mail, value);
    }
    public string Nazwisko
    {
        get => nazwisko;
        set => this.SetValue(ref nazwisko, value);
    }
    public string Imie
    {
        get => imie;
        set => this.SetValue(ref imie, value);
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void SetValue<T>(ref T oldValue, T newValue, [CallerMemberName] string propertyName = null)
    {
        oldValue = newValue;
        OnPropertyChanged(propertyName);
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}


public class MainWindowViewModel
{
    private int refreshCount;

    public ICommand RefreshCommand { get; }

    public ICommand PodgladUzytkownikaShow { get; }

    public podgladUzytkownika data { get; }

    public MainWindowViewModel()
    {
        data = new podgladUzytkownika();
        PodgladUzytkownikaShow = new Command(PodgladUzytkownikaShowExecute);
        RefreshCommand = new Command(RefreshCommandExecute);
    }

    private void PodgladUzytkownikaShowExecute(object obj)
    {
        var window = new Window();
        window.DataContext = data;
        window.Show();
    }

    private void RefreshCommandExecute(object obj)
    {
        // Data updates are passed to the view
        refreshCount++;
        data.Imie = nameof(data.Imie) + refreshCount;
        data.Nazwisko = nameof(data.Nazwisko) + refreshCount;
        data.Mail = nameof(data.Mail) + refreshCount;
    }
}

我试图这样解决它,但随后我得到了一个未经处理的异常,它是这样的:“System.InvalidCastException:无法将类型为'Z3.User_View'的对象强制转换为类型为'Z3.MainWindow'”,在这行代码中:((MainWindow)Application.Current.MainWindow)。Process(imieTextBox.Text,nazwiskoTextBox.Text,mailTextBox.Text);这是因为无论何时编辑“dane”文本框,Application.Current.MainWindow现在都是您的Podglad_Uzytkownika窗口,而不是您的主窗口。尝试将代码更改为
((主窗口)this.Owner).Process(imieTextBox.Text、nazwiskoTextBox.Text、mailTextBox.Text)不幸的是,它继续抛出未处理的异常。我已经尝试了所有方法,但仍然无法解决此问题。请显示更多代码,主要是所有xaml代码。如果没有完全可复制的样品,很难找到根本原因。还有,你到底在做什么来触发“dane”文本框?你在文本框中输入了什么吗?什么是“dane”?我已经发布了上面的完整代码。我试图像这样解决它,但是我得到了一个未经处理的异常,它是:((MainWindow)Application.Current.MainWindow)。Process)这行代码中的:“System.InvalidCastException:无法将类型为'Z3.User_View'的对象强制转换为类型'Z3.MainWindow'(imitetextbox.Text,nazwiskoTextBox.Text,mailTextBox.Text);这是因为无论何时编辑“dane”文本框,Application.Current.MainWindow现在都是您的PodGlady_Uzytkownika窗口,而不是您的主窗口。请尝试将代码更改为
((MainWindow)this.Owner)。进程(imitetextbox.Text,nazwiskoTextBox.Text,mailTextBox.Text)
不幸的是,它继续抛出未处理的异常。我已经尝试了所有方法,但仍然无法解决此问题。显示更多代码,主要是所有xaml代码。如果没有完全可复制的样本,很难帮助解决根本原因。另外,您实际上在做什么来触发“dane”文本框?你在文本框中输入了什么吗?什么是“dane”?我已经发布了上面的完整代码。