ComboBox SelectedItem绑定将NULL写入源属性

时间:2013-11-15 14:28:17

标签: wpf mvvm combobox

我有一个UserControl,它有一个ComboBox,它绑定到一个自己的依赖属性。

<UserControl x:Class="XamlParserComboBoxTest.ItemEditor" x:Name="aEditor">
    <Grid>
      <ComboBox Grid.Row="1"
                DisplayMemberPath="Name"
                ItemsSource="{Binding Path=Colors}"
                SelectedItem="{Binding ElementName=aEditor, 
                                       Path=Item.Color, 
                                       Mode=TwoWay}"/>

    </Grid>
</UserControl>

此DependencyProperty填充了Item类型的实例:

public class Item : ViewModelBase
{
    private Color _color { get; set; }
    public Color Color
    {
        get { return _color; }
        set
        {
            _color = value;
            if (value == null)
            {
                Console.WriteLine("Color set to NULL");
            }
            Console.WriteLine(value);
            OnPropertyChanged("Color");
        }
    }
}

public class Color
{
    public string Name { get; set; }
}

当UserControl被另一个UserControl替换时,将使用Color值调用Item的NULL setter。绑定到其他控件的属性不会发生任何更改。

虽然我已经解决了这个问题,但我真的需要了解导致这种情况的原因以及解决问题的最佳方式。

编辑:根据堆栈跟踪,null值来自Item's基类,但我不知道如何。完整源代码here。要重现此问题,请启动它并按两次“显示项目”按钮。

2 个答案:

答案 0 :(得分:0)

您可以使用TargetNullValue和可能的FallbackValue属性尝试这样的事情:

<ComboBox DisplayMemberPath="Name" ItemsSource="{Binding Path=Colors}" 
    SelectedItem="{Binding ElementName=aEditor, Path=Item.Color, 
    TargetNullValue=Black, FallbackValue=Black, Mode=TwoWay}" />

答案 1 :(得分:0)

您可以在有消息框的位置放置断点并检查调用堆栈。然后你就会知道是谁设置了空值。

然后,您可能会使用像'JustDecompile'这样的工具来找出原因。如果您不习惯,只需在此处发布调用堆栈,我将为您完成。