我有一个我在WPF中创建的应用程序,使用MVVM模式。在这个应用程序中,我有一个ObservableCollection<>电子邮件对象。我有一个Master-details表单,它在列表框中显示集合,类属性'Address','EType'和'isPrimary'分别显示在Textbox,combobox和checkbox中。
组合框具有列表<> EmailTypes作为ItemsSource,并且所选项目绑定到ViewModel中SelectedItem的Type属性。
一切都很好,非常简单。但是,我想序列化ObservableCollection以进行撤消。使用ISerializableSurrogate(方法here)也可以。有一个例外:
组合框不会绑定到SelectedItem.EType属性,至少不是最初的。当选择电子邮件对象时,代替显示类型的组合框,与预序列化版本的情况一样,组合框为空(未选中)。如果我在组合框中手动选择类型,它将起作用,并更新选定的电子邮件类型属性。我必须手动“重置”两个对象之间的绑定(?)。
地址(字符串)和CheckBox(布尔值)工作正常。并且反序列化的Email对象具有来自反序列化调用的预期EType嵌套对象;我可以在检查locals时在调试器中看到它。就好像绑定不能将EType对象的反序列化版本识别为有效的Etype对象...
究竟是什么想法分崩离析?我知道还有其他一些方法来处理我的撤销要求,但我真的想知道为什么这不起作用......
仅供参考,我知道这不是ObservableCollection的问题,因为我可以创建一个新的ObservableCollection,手动添加一个原始的Email对象和一个反序列化的电子邮件对象,我也有同样的问题。
以下是我的课程,非常简化:
此处的业务对象:
[Serializable]
public class Email : INotifyPropertyChanged
{
private int _id;
private string _address;
private emailType _eType;
private bool isPrimary;
public string Address
{
get { return _address; }
set
{
_address = value;
onPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
public EmailType EType
{
get { return _eType; }
set
{
_type = value;
onPropertyChanged(new PropertyChangedEventArgs("EType"));
}
}
public bool IsPrimary
{
get { return _isPrimary; }
set
{
_isPrimary = value;
onPropertyChanged(new PropertyChangedEventArgs("IsPrimary"));
}
}
这里的查找课程:
[Serializable]
public class emailType
{
protected readonly int _id;
protected String _name;
public int Id
{
get { return _id; }
}
public String Name
{
get { return _name; }
}
}
XAML中的组合框:
<ComboBox Grid.Column="1" Grid.Row="3" Height="23" HorizontalAlignment="Left" Margin="3" Name="typeComboBox" VerticalAlignment="Top" Width="190"
ItemsSource="{Binding EmailTypes}" IsSynchronizedWithCurrentItem="False" >
<ComboBox.SelectedItem>
<Binding Path="SelectedEmail.EType" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NullValueRule></local:NullValueRule>
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
</ComboBox>
答案 0 :(得分:3)
您需要覆盖emailType类中的Equals方法。如果不这样做,则使用从object继承的实现。
此实现比较对象引用。反序列化的对象可能具有所有相同的属性,但它是一个不同的对象,并且不会“相等”。