嵌套自定义对象的反序列化绑定问题

时间:2011-08-07 04:23:19

标签: c# wpf xaml data-binding serialization

我有一个我在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>

1 个答案:

答案 0 :(得分:3)

您需要覆盖emailType类中的Equals方法。如果不这样做,则使用从object继承的实现。

此实现比较对象引用。反序列化的对象可能具有所有相同的属性,但它是一个不同的对象,并且不会“相等”。