我有一个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。要重现此问题,请启动它并按两次“显示项目”按钮。
答案 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'这样的工具来找出原因。如果您不习惯,只需在此处发布调用堆栈,我将为您完成。