我正在尝试创建自定义用户控件,与DataGrid具有类似的功能(但DataGrid在这里不是正确的选项)。
我想要实现的是像这样的功能:
<my:CustomList ItemsSource="{Binding Items}">
<my:CustomList.Columns>
<my:Column Width="60" Binding="{Binding MyCustomProperty}" />
</my:CustomList.Columns>
</my:CustomList>
Items将从ViewModel中获取(例如):
public ObservableCollection<Item> Items { get; set; }
public class Item
{
public string MyCustomProperty { get; set; }
public string MyAnotherCustomProperty { get; set; }
}
我的问题在于绑定到MyCustomProperty。
如果我从DataGrid继承自定义控件并使用其列,则DataContext可以很好地从ItemsSource流动到列中的Bindings。我希望对于不继承自DataGrid的自定义控件也是如此。DataGrid.Columns从ItemsSource获取上下文的神奇原理是什么?
编辑: 让我用另一种方式问这个问题:
如果我实现自定义DataGridColumn
public class MyDataGridColumn : DataGridBoundColumn
{
private Binding _bindingSubText;
public Binding BindingSubText
{
get
{
return _bindingSubText;
}
set
{
if (_bindingSubText == value) return;
var oldBinding = _bindingSubText;
_bindingSubText = value;
OnBindingChanged(oldBinding, _bindingSubText);
}
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var textTextBlock = new TextBlock();
var bindingText = Binding ?? new Binding();
textTextBlock.SetBinding(TextBlock.TextProperty, bindingText);
var textSubTextBlock = new TextBlock();
var bindingSubText = BindingSubText ?? new Binding();
textSubTextBlock.SetBinding(TextBlock.TextProperty, bindingSubText);
var stackPanel = new StackPanel() { Orientation = Orientation.Vertical };
stackPanel.Children.Add(textTextBlock);
stackPanel.Children.Add(textSubTextBlock);
return stackPanel;
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
// I don't want to edit elements
return null;
}
}
并尝试在XAML中像这样使用它:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<my:MyDataGridColumn Binding="{Binding MyCustomProperty}" BindingSubText="{Binding MyAnotherCustomProperty}" />
</DataGrid.Columns>
</DataGrid>
绑定 BindingSubText 属性仍将使用 DataGrid 父级的 DataContext,为我提供 Items。MyAnotherCustomProperty 在设计时会有波浪线,但运行时会正常工作(因为动态绑定)。我的问题是当其他人使用此自定义 DataGridColumn 时,他/她需要知道这一点,并且绑定的 IntelliSense 会出现“错误”。
如何设置 DataGridColumn 的 Binding 属性的上下文,以便 IntelliSense 能够按预期工作?