列表DependencyProperty始终返回null

时间:2018-12-14 18:36:23

标签: c# wpf xaml dependency-properties

我有一个具有以下DependencyProperty的自定义控件“ ToolbarMenuButton”:

public ObservableCollection<object> TbMenuItems
{
    get { return (ObservableCollection<object>)GetValue(TbMenuItemsProperty); }
    set { SetValue(TbMenuItemsProperty, value); }
}

public static readonly DependencyProperty TbMenuItemsProperty =
    DependencyProperty.Register("TbMenuItems", typeof(ObservableCollection<object>), typeof(ToolbarMenuButton), new PropertyMetadata(null));

我这样设置:

<customs:ToolbarMenuButton TbText="By Flight" TbIcon="PlaneRotated45"
                           TbMenuItems="{Binding Flights}"
                           TbItemCommand="{Binding FlightSelect}">

它显示出来,没问题。现在,自定义控件中有一个用于此按钮的单击处理程序,可确保设置了上下文菜单,如果未设置,则会根据上面显示的依赖属性“ TbMenuItems”创建一个新菜单。

错误: 此属性始终为null(单击按钮时在运行时得到null异常)。我已经解决了大约40个stackoverflow答案,这些答案要么是N / A,要么是没有解决。据我了解,不会调用/设置依赖项属性,但是我不确定该如何从中获取数据。

我尝试过的事情: 我试过在设置航班时通知属性更改。我已经通过在按钮旁边的文本块中放置其中之一来确保设置了Flights(所以我也知道datacontext和path等都是正确的)。我已将其更改为可观察的集合(最初是列表),以查看是否有帮助。其他依赖项属性似乎都可以正常工作(当然,它们也以该样式绑定到数据模板,不确定是否重要)。我不确定现在要去哪里。

1 个答案:

答案 0 :(得分:1)

问题是您为collection-type属性使用了一种过于具体的类型,该类型与数据绑定产生的值不兼容。

您应该改用可能使用的最通用的收集类型,通常是IEnumerable

public IEnumerable TbMenuItems
{
    get { return (IEnumerable)GetValue(TbMenuItemsProperty); }
    set { SetValue(TbMenuItemsProperty, value); }
}

public static readonly DependencyProperty TbMenuItemsProperty = DependencyProperty.Register(
    nameof(TbMenuItems), typeof(IEnumerable), typeof(ToolbarMenuButton));