【问题标题】:WPF binding not being set to UserControl DependencyPropertyWPF 绑定未设置为 UserControl DependencyProperty
【发布时间】:2013-01-25 18:29:34
【问题描述】:

我有一个绑定到对象列表的 ListView。当我在 ListView 中选择一个项目时,我会捕获一个 SelectionChanged 事件,然后将所选对象传递给详细信息视图。

protected void list_selectionChanged(object sender, SelectionChangedEventArgs e) {
    var myObject = theList.SelectedItem as MyObjectType;

    detailsView.DataContext = myObject;
}

detailsView 是与 ListView 相同的 WPF 中的 UserControl。它包含一些 XAML,如下所示:

<Label Content="{Binding Path=deviceId}"></Label>
<l:MyUc deviceId="{Binding Path=deviceId}" />

在 MyUC 中,我定义了一个 DependencyProperty:

public static readonly DependencyProperty deviceIdProperty = DependencyProperty.Register("deviceId", typeof(Guid), typeof(MyUC), new FrameworkPropertyMetadata(null));

public Guid deviceId {
    get { return (Guid)GetValue(deviceIdProperty); }
    set { SetValue(deviceIdProperty, value); }
}

Label 显示的是 deviceId,但 MyUC 中的属性永远不会被设置。

谁能看出我的错误?

【问题讨论】:

  • InotifyPropertyChanged 我想是问题。在 set 函数中应该引发 PropertyChanged 事件
  • 如果您复制/粘贴代码,我会说问题可能是您需要在 xaml 的第二行(代码的第二部分)中使用大写 P
  • @iltzortz 我实际上在该属性集中有一个断点,它永远不会被调用。
  • @ppetrov 谢谢,这是创建问题的一个问题。实际代码大写正确。
  • 新的 FrameworkPropertyMetadata(null));也许尝试 SqlGuid.Null 而不是 null

标签: c# wpf


【解决方案1】:

在 XAML 中使用依赖属性时,永远不会调用 set 方法。如果你想“看到”这个集合,你需要添加一个属性更改回调,因为绑定机制直接设置依赖属性,而不需要你的 setter。

有关如何实现此功能的详细信息,请参阅PropertyChanged callbacks section of MSDN

【讨论】:

    【解决方案2】:

    首先,如果您可以在定义 ListView 及其属性的位置添加实际的 XAML 代码,将会很有帮助。

    其次,您应该查看输出控制台(当然是在 Visual Studio 调试会话中),看看您定义的绑定是否存在绑定错误。

    绑定提供的值很可能不符合 deviceId 依赖属性类型,因此它永远不会改变。

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2013-01-20
      • 2012-06-06
      • 2013-06-03
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多