【问题标题】:Data-Binding with Custom Dependency-Property of UserControl is not working使用 UserControl 的自定义依赖属性进行数据绑定不起作用
【发布时间】:2017-03-15 13:44:41
【问题描述】:

我有一个 UserControl 和 2 个自定义 DependencyPropertys(ColumnsCountRowsCount):

public partial class CabinetGrid : UserControl
{

    public static readonly DependencyProperty ColumnsCountProperty =
        DependencyProperty.Register("ColumnsCount", typeof (int), typeof (CabinetGrid));

    public static readonly DependencyProperty RowsCountProperty =
        DependencyProperty.Register("RowsCount", typeof (int), typeof (CabinetGrid));

    public int ColumnsCount
    {
        get { return (int) GetValue(ColumnsCountProperty); }
        set { SetValue(ColumnsCountProperty, value); }
    }
    public int RowsCount
    {
        get { return (int) GetValue(RowsCountProperty); }
        set { SetValue(RowsCountProperty, value); }
    }
}

这是DataBinding

<view:CabinetGrid Grid.Column="1" Grid.Row="2" x:Name="GridRack" ColumnsCount="{Binding SelectedRoom.ColumnCount}" />

而窗口的DataContext 有一个属性SelectedRoom 调用PropertyChanged-Event
通过调试,我知道UserControlDataContext 设置正确

但是,当SelectedRoom 发生更改时(=> 我在列表中选择了另一个项目),我的UserControlDependencyProperty ColumnsCount 不会更新。 我感到非常沮丧,因为我已经使用XAMLSpyWpfSpoon 之类的工具,花了一整天的时间来调试这个意想不到的东西。
请帮忙。


编辑:
Clemens 已经指出,包裹DependencyProperty (ColumnsCount) 的CLR-Property 中的断点不会触发。这是一个主要问题,因为我必须调用一些更改方法。我正在尝试使用PropertyChangedCallback,但目前遇到了一些错误。

【问题讨论】:

  • 谢谢,但它也不起作用。
  • “我的 UserControl 的 ColumnsCount 未更新”。你具体是怎么检查的?您根本没有看到任何东西,或者只是没有改变值吗?是否有针对源属性(即SelectedRoom)的属性更改通知机制?
  • @Clemens 当然,SelectedRoom ofc 调用了PropertyChanged-事件。我还在另一个UserControl 中创建了DataBindingSelectedRoom,并且我可以正确绑定到SelectedRoom 的任何属性(它确实更新了)
  • 你没有意外地(明确地)在某个地方设置了你的 CabinetGrid 的 DataContext?
  • 我检查更改,例如通过在DependencyPropertys Setter 中使用断点以及将标签文本绑定到SelectedRoom.ColumnCount。不,DataContext(至少在Loaded-Event 中)被正确设置为具有SelectedRoom 属性的对象。

标签: c# wpf data-binding user-controls dependency-properties


【解决方案1】:

为了获得有关依赖属性值更改的通知,您应该在注册属性时在 PropertyMetadata 中指定一个 PropertyChangedCallback。

public static readonly DependencyProperty ColumnsCountProperty =
    DependencyProperty.Register(
        "ColumnsCount", typeof(int), typeof(CabinetGrid),
         new PropertyMetadata(OnColumnsCountPropertyChanged));

private static void OnColumnsCountPropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
     var cabinetGrid = (CabinetGrid)obj;

     // do something with the CabinetGrid instance
}

【讨论】:

  • 回调,当然,引发事件,不。在更改的回调中,获取数据网格上下文,并在那里更新属性。那么你应该最终进入二传手,对吧? (只是大声思考)
  • @TomVanSchaijk 只有在有事可做时才需要回调。我们不知道,还不如有一个内部绑定。并且“获取数据网格上下文,并更新那里的属性”也是错误的。您通常不会直接对 DataContext 进行操作。这就是绑定的用途。
  • 是的,当属性发生变化时有一些事情要做……抱歉没有说清楚。添加回调后,我收到错误The standard value type doesnt fit (Standardwerttyp stimmt nicht mit der Eigenschaft ColumnsCountüberein)
  • @ANewQuestionnaire 如果您复制此代码,则会出现错误 - 在 FrameworkPropertyMetadata 构造函数中指定为默认属性值的值是 falsebool),而属性是键入int,因此您应该指定一个适当的默认值(例如0)。
  • @ANewQuestionnaire 我已经修复了答案,以便它可以提示您在哪里继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多