Tôi đang cố gắng tạo điều khiển người dùng tùy chỉnh, với chức năng tương tự như DataGrid (nhưng DataGrid không phải là tùy chọn phù hợp tại đây).Điều khiển tùy chỉnh với tầng DataContext thành phần con trong bộ sưu tập
Những gì tôi muốn đạt được là một cái gì đó như thế này:
<my:CustomList ItemsSource="{Binding Items}">
<my:CustomList.Columns>
<my:Column Width="60" Binding="{Binding MyCustomProperty}" />
</my:CustomList.Columns>
</my:CustomList>
nơi Items sẽ đến từ ViewModel (ví dụ) như thế này:
public ObservableCollection<Item> Items { get; set; }
public class Item
{
public string MyCustomProperty { get; set; }
public string MyAnotherCustomProperty { get; set; }
}
Tôi có vấn đề là với ràng buộc để MyCustomProperty.
Nếu tôi kế thừa điều khiển tùy chỉnh của mình từ DataGrid và sử dụng cột của nó, DataContext truyền từ ItemsSource đến Bindings trong cột tốt. Tôi muốn làm tương tự với điều khiển tùy chỉnh của tôi, mà không kế thừa từ DataGrid. Ma thuật đằng sau DataGrid.Columns nhận được bối cảnh từ ItemsSource là gì?
Edit: Hãy để tôi hỏi một cách khác xung quanh về vấn đề này:
Nếu tôi thực hiện tùy chỉnh 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;
}
}
và cố gắng sử dụng nó trong XAML như thế này:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<my:MyDataGridColumn Binding="{Binding MyCustomProperty}" BindingSubText="{Binding MyAnotherCustomProperty}" />
</DataGrid.Columns>
</DataGrid>
Binding cho BindingSubText propertywould vẫn còn đi kèm với DataContext của DataGrid của cha mẹ, cung cấp cho tôi Items. MyAnotherCustomProperty sẽ có wigglies trong thiết kế, nhưng nó sẽ làm việc OK thời gian chạy (vì ràng buộc năng động). Vấn đề của tôi là khi ai đó sẽ sử dụng DataGridColumn tùy chỉnh này, anh/cô ấy sẽ cần phải biết rằng, và sẽ có "sai" IntelliSense cho ràng buộc.
Ngữ cảnh cho thuộc tính Ràng buộc của tập dữ liệu DataGridColumn, sao cho IntelliSense hoạt động như mong đợi?
nó xuất phát từ ItemsControl và nó quản lý chúng, từ đó kiểm soát được bạn bắt nguồn? – ZSH
Mỏ có nguồn gốc từ ItemsControl. –
bạn đã xác định như thế nào (tạo thử nghiệm)? –
ZSH