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在他的回答中告诉你的。你应该承认这是正确的,因为它确实回答了你的问题,如上所述。