【问题标题】:Why is my dependency property on a custom UserControl not recognized?为什么无法识别我对自定义 UserControl 的依赖属性?
【发布时间】:2017-02-01 13:18:06
【问题描述】:

我有一个名为BranchFilterUserControl,具有以下属性:

private int? _branchId;
public int? LocalBranchId
{
    get { return _branchId; }
    set
    {
        SetProperty(ref _branchId, value);
        OnBranchChanged();
    }
}

在同一个控件中,我注册了一个依赖属性,以便我可以将分支 id 绑定到一个视图模型:

public static readonly DependencyProperty BranchIdProperty = DependencyProperty.Register(nameof(LocalBranchId), typeof(int?), typeof(BranchFilter), new UIPropertyMetadata(null));

当我尝试访问此属性时,甚至没有绑定它,在视图中,如下所示:

<controls:BranchFilter Grid.Row="0" BranchId="0">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="BranchChanged">
            <i:InvokeCommandAction Command="{Binding LoadItems}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</controls:BranchFilter>

我得到编译错误:

成员“BranchId”无法识别或无法访问。

在“BranchFilter”类型中找不到属性“BranchId”。

XML 命名空间中不存在属性“BranchId” 'clr-namespace:ApptBook.Client.Modules.Common.Controls'

我遵循了每个示例,但它们都是相同的,用于添加依赖属性,但我尝试的一切都失败了。这么简单的事情有什么问题?

【问题讨论】:

  • 我猜应该是LocalBranchIdProperty
  • 使用propdpcode-sn-p生成依赖属性正确
  • @Sinatr 我没有 sn-p。
  • @ProfK,我相信你有。键入propdp 并按两次Tab 键。
  • 请注意,正确的依赖属性声明需要一个 CLR 属性包装器,该包装器在其 get 和 set 访问器中调用 GetValueSetValue。您不能声明包装 CLR 属性的依赖项属性。见Custom Dependency Properties

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


【解决方案1】:

您不应该使用LocalBranchId 而不是BranchId 访问它吗?

<controls:BranchFilter Grid.Row="0" LocalBranchId="0">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="BranchChanged">
            <i:InvokeCommandAction Command="{Binding LoadItems}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</controls:BranchFilter>

我还将DependencyPropertyBranchIdProperty 重命名为LocalBranchIdProperty

【讨论】:

  • 啊,是的。我误解了依赖属性注册来创建一个围绕 POCO 属性的包装器,但它实际上将 POCO 属性注册为依赖属性,所以我仍然应该访问 POCO ,它将具有依赖属性的行为。
【解决方案2】:

您应该正确地将LocalBranchId 声明为依赖属性:

public static readonly DependencyProperty LocalBranchIdProperty =
    DependencyProperty.Register(
        nameof(LocalBranchId), typeof(int?), typeof(BranchFilter));

public int? LocalBranchId
{
    get { return (int?)GetValue(LocalBranchIdProperty); }
    set { SetValue(LocalBranchIdProperty, value); }
}

如果需要在属性值发生变化时得到通知,可以注册一个 PropertyMetadata 的 PropertyChangedCallback:

public static readonly DependencyProperty LocalBranchIdProperty =
    DependencyProperty.Register(
        nameof(LocalBranchId), typeof(int?), typeof(BranchFilter),
        new PropertyMetadata(LocalBranchIdPropertyChanged));

public int? LocalBranchId
{
    get { return (int?)GetValue(LocalBranchIdProperty); }
    set { SetValue(LocalBranchIdProperty, value); }
}

private static void LocalBranchIdPropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    var control = (BranchFilter)obj;
    var id = (int?)e.NewValue;
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多