Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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# 组合框的SelectedItem中的更改会改变ItemsSource_C#_Wpf_Mvvm - Fatal编程技术网

C# 组合框的SelectedItem中的更改会改变ItemsSource

C# 组合框的SelectedItem中的更改会改变ItemsSource,c#,wpf,mvvm,C#,Wpf,Mvvm,我的XAML中有一个组合框和一个数据网格: <ComboBox SelectedItem="{Binding SelectedFamily}" ItemsSource="{Binding FamilyList}" IsSynchronizedWithCurrentItem="True"/> <DataGrid ItemsSource="{Binding FamilyInfoGrid}" AutoGenerateColumns="False"> <DataGr

我的XAML中有一个组合框和一个数据网格:

<ComboBox SelectedItem="{Binding SelectedFamily}" ItemsSource="{Binding FamilyList}" IsSynchronizedWithCurrentItem="True"/>
<DataGrid ItemsSource="{Binding FamilyInfoGrid}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Age" Binding="{Binding Age}" />
    </DataGrid.Columns>
</DataGrid>

问题是,在DataGrid中进行的更改存储在_familyList中,但我希望_familyList是不可变的,并且只能临时编辑(和使用)DataGrid的当前字段(因此
模式=单向
也不是一个选项)。

多亏了@mm8,我找到了一个解决方案。组合框的当前选定项必须是“深度复制”:


我有点不清楚:datagrid IsReadOnly=“True”是您需要的吗?或者您是否希望用户能够临时编辑所选项目,但在取消选择项目时放弃更改?是@kkirk,我希望用户能够临时编辑所选项目,但在取消选择项目时放弃更改。那么,能够编辑数据有什么意义?您打算对编辑的数据做什么?我想根据datagrid内容执行另一个函数,其结果将显示在视图中,用户应该能够更改数据并暂时查看对函数的影响。@mm8这当然是一个人为的示例。在我的真实示例中,当窗口加载时,我将数据从SQL数据库保存到ReadOnlyObservableCollection中。但是,我不希望在combobox的SelectedItem的每个getter上都从数据库请求数据。
public class MainWindowViewModel : INotifyPropertyChanged
{
    private ReadOnlyObservableCollection<Family> _familyList;
    public ReadOnlyObservableCollection<Family> FamilyList
    {
        get { return _familyList; }
    }

    private Family _selectedFamily;
    public Family SelectedFamily
    {
        get
        {
            return _selectedFamily;
        }
        set
        {
            _familyInfoGrid.Clear();
            _familyInfoGrid.Add(value.Kid);
            _familyInfoGrid.Add(value.Parent2);
            _familyInfoGrid.Add(value.Parent1);
            RaisePropertyChangedEvent();
        }
    }

    private ObservableCollection<Person> _familyInfoGrid = new ObservableCollection<Person>();
    public ObservableCollection<Person> FamilyInfoGrid
    {
        get { return _familyInfoGrid; }
        set { _familyInfoGrid = value; RaisePropertyChangedEvent(); }
    }

    public MainWindowViewModel()
    {
        var fam1 = new Family("Smith", new Person("Jim", 31), new Person("Eve", 29), new Person("Tom", 2));
        var fam2 = new Family("Miller", new Person("Joe", 35), new Person("Sue", 33), new Person("Kim", 8));
        _familyList = new ReadOnlyObservableCollection<Family>(new ObservableCollection<Family>() { fam1, fam2 } );
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChangedEvent([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class Family
{
    public string Name { get; set; }
    public Person Kid { get; set; }
    public Person Parent1 { get; set; }
    public Person Parent2 { get; set; }

    public Family(string name, Person parent1, Person parent2, Person kid)
    {
        Name = name;  Parent1 = parent1; Parent2 = parent2; Kid = kid;
    }

    public override string ToString()
    {
        return Name;
    }
}


public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name; Age = age;
    }
}
public Family SelectedFamily
{
    set
    {
        var fam = new Family(
            new string(value.Name.ToCharArray()),
            new Person(value.Parent1.Name, value.Parent1.Age),
            new Person(value.Parent2.Name, value.Parent2.Age),
            new Person(value.Kid.Name, value.Kid.Age));
        _familyInfoGrid.Clear();
        _familyInfoGrid.Add(fam.Kid);
        _familyInfoGrid.Add(fam.Parent2);
        _familyInfoGrid.Add(fam.Parent1);
        RaisePropertyChangedEvent();
    }
}