C#WPF MVVM组合框选择编辑项

C#WPF MVVM组合框选择编辑项,c#,wpf,mvvm,combobox,binding,C#,Wpf,Mvvm,Combobox,Binding,我知道它已经在这里出现过一百万次了,但我不知道我的代码出了什么问题。我尝试了所有操作,但组合框未正确绑定SelectedItem。 这是我完整的沙盒解决方案。您也可以在GitHub()上找到它 BindableBase.cs public class BindableBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public virtual vo

我知道它已经在这里出现过一百万次了,但我不知道我的代码出了什么问题。我尝试了所有操作,但组合框未正确绑定
SelectedItem
。 这是我完整的沙盒解决方案。您也可以在GitHub()上找到它

BindableBase.cs

public class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class ContactModel : BindableBase
{
    private int _Id;
    public int Id
    {
        get { return _Id; }
        set
        {
            _Id = value;
            RaisePropertyChanged(nameof(Id));
        }
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            RaisePropertyChanged(nameof(Name));
        }
    }

    private string _Phone;
    public string Phone
    {
        get { return _Phone; }
        set
        {
            _Phone = value;
            RaisePropertyChanged(nameof(Phone));
        }
    }

    public override bool Equals(object obj)
    {
        if (obj != null || !(obj is ContactModel))
            return false;

        return ((ContactModel)obj).Id == this.Id;
    }

    public override string ToString()
    {
        return $"{Name} {Phone}";
    }
}
public partial class MainWindow : Window
{
    public MainViewModel ViewModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        ViewModel = new MainViewModel();
        ViewModel.SelectedContact = new ContactModel
        {
            Id = 2,
            Name = "Some Guy",
            Phone = "+123456789"
        };
    }
}
public class MainViewModel : BindableBase
{
    public List<ContactModel> Contacts
    {
        get
        {
            return new List<ContactModel>
            {
                new ContactModel() {Id = 1, Name = "John Doe", Phone = "+166666333" },
                new ContactModel() {Id = 2, Name = "Some Guy", Phone = "+123456789" }
            };
        }
    }

    private ContactModel _SelectedContact;
    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            RaisePropertyChanged(nameof(SelectedContact));
        }
    }
}
ContactModel.cs

public class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class ContactModel : BindableBase
{
    private int _Id;
    public int Id
    {
        get { return _Id; }
        set
        {
            _Id = value;
            RaisePropertyChanged(nameof(Id));
        }
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            RaisePropertyChanged(nameof(Name));
        }
    }

    private string _Phone;
    public string Phone
    {
        get { return _Phone; }
        set
        {
            _Phone = value;
            RaisePropertyChanged(nameof(Phone));
        }
    }

    public override bool Equals(object obj)
    {
        if (obj != null || !(obj is ContactModel))
            return false;

        return ((ContactModel)obj).Id == this.Id;
    }

    public override string ToString()
    {
        return $"{Name} {Phone}";
    }
}
public partial class MainWindow : Window
{
    public MainViewModel ViewModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        ViewModel = new MainViewModel();
        ViewModel.SelectedContact = new ContactModel
        {
            Id = 2,
            Name = "Some Guy",
            Phone = "+123456789"
        };
    }
}
public class MainViewModel : BindableBase
{
    public List<ContactModel> Contacts
    {
        get
        {
            return new List<ContactModel>
            {
                new ContactModel() {Id = 1, Name = "John Doe", Phone = "+166666333" },
                new ContactModel() {Id = 2, Name = "Some Guy", Phone = "+123456789" }
            };
        }
    }

    private ContactModel _SelectedContact;
    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            RaisePropertyChanged(nameof(SelectedContact));
        }
    }
}
main window.xaml

<Window x:Class="WpfApplication1.MainWindow"
    ...>
<Grid>
    <ComboBox Width="200" Height="23"
              SelectedItem="{Binding ViewModel.SelectedContact}" ItemsSource="{Binding ViewModel.Contacts}" />
</Grid>
MainViewModel.cs

public class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void RaisePropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class ContactModel : BindableBase
{
    private int _Id;
    public int Id
    {
        get { return _Id; }
        set
        {
            _Id = value;
            RaisePropertyChanged(nameof(Id));
        }
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            RaisePropertyChanged(nameof(Name));
        }
    }

    private string _Phone;
    public string Phone
    {
        get { return _Phone; }
        set
        {
            _Phone = value;
            RaisePropertyChanged(nameof(Phone));
        }
    }

    public override bool Equals(object obj)
    {
        if (obj != null || !(obj is ContactModel))
            return false;

        return ((ContactModel)obj).Id == this.Id;
    }

    public override string ToString()
    {
        return $"{Name} {Phone}";
    }
}
public partial class MainWindow : Window
{
    public MainViewModel ViewModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        ViewModel = new MainViewModel();
        ViewModel.SelectedContact = new ContactModel
        {
            Id = 2,
            Name = "Some Guy",
            Phone = "+123456789"
        };
    }
}
public class MainViewModel : BindableBase
{
    public List<ContactModel> Contacts
    {
        get
        {
            return new List<ContactModel>
            {
                new ContactModel() {Id = 1, Name = "John Doe", Phone = "+166666333" },
                new ContactModel() {Id = 2, Name = "Some Guy", Phone = "+123456789" }
            };
        }
    }

    private ContactModel _SelectedContact;
    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            RaisePropertyChanged(nameof(SelectedContact));
        }
    }
}
公共类MainViewModel:BindableBase { 公开名单联系人 { 收到 { 返回新列表 { 新建ContactModel(){Id=1,Name=“John Doe”,Phone=“+166666333”}, 新建ContactModel(){Id=2,Name=“Some Guy”,Phone=“+123456789”} }; } } 私人联系人模式_选择联系人; 公共联系人模式选择联系人 { 获取{return\u SelectedContact;} 设置 { _SelectedContact=值; RaisePropertyChanged(所选联系人的姓名)); } } }
您需要将列表与当前选定的项目同步:

1.Xaml:

<ComboBox ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact}" IsSynchronizedWithCurrentItem="True" />

2.2.2视图模型:

public ObservableCollection<ContactModel> Contacts { get; set; }

    public MainViewModel()
    {
        _model = new Model {Name = "Prop Name" };
        Contacts = new ObservableCollection<ContactModel>
        {
            new ContactModel {Id = 1, Name = "John Doe", Phone = "+166666333"},
            new ContactModel {Id = 2, Name = "Some Guy", Phone = "+123456789"}
        };
        SelectedContact = Contacts[0];
    }

    private ContactModel _SelectedContact;

    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            OnPropertyChanged(nameof(SelectedContact));
        }
    }
publicobservableCollection联系人{get;set;}
公共主视图模型()
{
_模型=新模型{Name=“Prop Name”};
Contacts=新的ObservableCollection
{
新联系人模型{Id=1,Name=“John Doe”,Phone=“+166666333”},
新联系人模型{Id=2,Name=“Some Guy”,Phone=“+123456789”}
};
SelectedContact=联系人[0];
}
私人联系人模式_选择联系人;
公共联系人模式选择联系人
{
获取{return\u SelectedContact;}
设置
{
_SelectedContact=值;
OnPropertyChanged(姓名(SelectedContact));
}
}

您需要将列表与当前选定的项目同步:

1.Xaml:

<ComboBox ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact}" IsSynchronizedWithCurrentItem="True" />

2.2.2视图模型:

public ObservableCollection<ContactModel> Contacts { get; set; }

    public MainViewModel()
    {
        _model = new Model {Name = "Prop Name" };
        Contacts = new ObservableCollection<ContactModel>
        {
            new ContactModel {Id = 1, Name = "John Doe", Phone = "+166666333"},
            new ContactModel {Id = 2, Name = "Some Guy", Phone = "+123456789"}
        };
        SelectedContact = Contacts[0];
    }

    private ContactModel _SelectedContact;

    public ContactModel SelectedContact
    {
        get { return _SelectedContact; }
        set
        {
            _SelectedContact = value;
            OnPropertyChanged(nameof(SelectedContact));
        }
    }
publicobservableCollection联系人{get;set;}
公共主视图模型()
{
_模型=新模型{Name=“Prop Name”};
Contacts=新的ObservableCollection
{
新联系人模型{Id=1,Name=“John Doe”,Phone=“+166666333”},
新联系人模型{Id=2,Name=“Some Guy”,Phone=“+123456789”}
};
SelectedContact=联系人[0];
}
私人联系人模式_选择联系人;
公共联系人模式选择联系人
{
获取{return\u SelectedContact;}
设置
{
_SelectedContact=值;
OnPropertyChanged(姓名(SelectedContact));
}
}

我昨天刚刚回答了这个问题@谢谢!我在没有序列化的情况下做了这个沙盒解决方案,真正的问题是序列化和缺少
JsonSerializerSettings
-track对象实例。哈,讽刺。但是你现在知道问题是实例不一样。这就是@rom在他的回答中告诉你的。你应该承认这是正确的,因为它确实回答了你上面提到的问题。我昨天刚刚回答了这个问题@会谢谢你的!我在没有序列化的情况下做了这个沙盒解决方案,真正的问题是序列化和缺少
JsonSerializerSettings
-track对象实例。哈,讽刺。但是你现在知道问题是实例不一样。这就是@rom在他的回答中告诉你的。你应该承认这是正确的,因为它确实回答了你的问题,如上所述。