我正在尝试使用绑定来处理用户控件的子对象. Xaml看起来像这样:
<MyGrid>
<MyColumn ExtendedColumnData="{Binding ColumnToolTipDescriptions}"/>
</MyGrid>
以下是类的定义方式:
[ContentProperty("Columns")]
public class MyGrid : UserControl
{
private MyColumnCollection _columns;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Category("Data")]
public MyColumnCollection Columns
{
get
{
if (_columns == null)
_columns = new MyColumnCollection();
return _columns;
}
}
}
public class MyColumnCollection : ObservableCollection<MyGridColumn>
{
}
public class MyGridColumn : DependencyObject
{
public object ExtendedColumnData
{
get { return (object)GetValue(ExtendedColumnDataProperty); }
set { SetValue(ExtendedColumnDataProperty, value); }
}
public static readonly DependencyProperty ExtendedColumnDataProperty =
DependencyProperty.Register("ExtendedColumnData", typeof(object), typeof(MyGridColumn), new UIPropertyMetadata(null));
}
据我所知,绑定甚至没有试图获取数据,因为我已经尝试将转换器放在绑定上,并且Convert方法上的断点永远不会被命中.
我正在使用MVVM模式,因此窗口的DataContext属性设置为视图模型.
我在这里阅读了一些其他问题并尝试了绑定的各种排列,例如:
<MyColumn ExtendedColumnData="{Binding DataContext.ColumnToolTipDescriptions, ElementName=MyViewName}" />
<MyColumn ExtendedColumnData="{Binding DataContext.ColumnToolTipDescriptions, RelativeSource={RelativeSource AncestorType={x:Type local:MyView}}" />
但仍然没有运气,绑定不会开火!令人讨厌的是,这似乎工作正常(如果我将属性添加到网格):
<MyGrid ExtendedColumnData="{Binding ColumnToolTipDescriptions}">
<MyColumn />
</MyGrid>
我对WPF没有经验,所以我确定我错过了什么?
最佳答案 问题是MyColumnCollection不继承数据上下文(控件的常用属性不是继承上下文的一部分).如果您没有数据上下文绑定将无法正常工作.
要解决这个问题,请尝试继承MyColumnCollection,而不是从ObservableCollection继承,而是从FreezableCollection继承(freezable属性是继承上下文的一部分).