【问题标题】:ComboBox SelectedItem binding writes NULL to source propertyComboBox SelectedItem 绑定将 NULL 写入源属性
【发布时间】:2013-11-15 14:28:16
【问题描述】:

我有一个用户控件,它有一个组合框,绑定到它自己的依赖属性之一。

<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 替换时,Item 的 Color 设置器将使用 NULL 值调用。绑定到其他控件的属性不会发生任何变化。

虽然我已经解决了这个问题,但我确实需要了解导致此问题的原因以及解决此问题的最佳方法。

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

【问题讨论】:

  • "When the UserControl is replaced with another UserControl" 到底是什么意思? ItemsSource 来自哪里?
  • @HighCore,请查看源代码。通过将ContentControl 的内容绑定到由我的 ICommand 实现设置的属性,我只在窗口中心显示一个编辑器控件。

标签: wpf mvvm combobox


【解决方案1】:

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

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

【讨论】:

  • 据我所知,这只会影响绑定的 ComboBox 项目一侧,而另一侧有问题...
【解决方案2】:

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

那么您可能可以使用“JustDecompile”之类的工具来找出原因。如果您不习惯,只需在此处发布调用堆栈,我会为您完成。

【讨论】:

  • 谢谢,SoMoS。你能解释一下 JustDecompile 如何帮助我吗?鉴于这个名字,我认为它是一个反编译器......
  • 当您有可用的堆栈跟踪时,您将能够知道为什么设置了 null,然后您就知道如何避免它。
  • 我已经上传了源代码。同时,我想了解您的建议,但不知道如何为 JustDecompile 提供堆栈跟踪...
  • 按照我在答案上写的去做。在消息框上放一个断点,然后转到visual studio -> debug -> windows -> callstack 并告诉我那里有什么。您不会将调用堆栈提供给反编译器,而是查看 .Net 为在其中放置 null 所做的工作。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2019-11-10
  • 2014-12-08
  • 1970-01-01
  • 2014-10-10
  • 2011-11-01
相关资源
最近更新 更多