为什么我的自定义UserControl上的依赖项属性无法识别?

时间:2017-02-01 13:18:07

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

我有一个名为UserControl的{​​{1}},其中包含以下属性:

BranchFilter

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

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

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

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

我收到编译错误:

  

会员" BranchId"无法识别或无法访问。

     

该物业' BranchId'未在类型' BranchFilter'中找到。

     

该物业' BranchId'在XML命名空间中不存在   ' CLR-名称空间:ApptBook.Client.Modules.Common.Controls'

我已经关注了每个示例,但他们都是一样的,因为添加了依赖项属性,但我尝试过的所有内容都失败了。这么简单的事情可能有什么问题?

2 个答案:

答案 0 :(得分:2)

您是否应该使用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

答案 1 :(得分:1)

您应该正确地将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); }
}

如果您需要在属性值更改时收到通知,则可以注册a PropertyMetnge的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;
    ...
}