2014-07-02 110 views
4

我有UserControl,我们称之为CustomDataGrid,其中包含DataGrid。剩余内容无关紧要。 SelectedItemDataGrid的财产必须是SelectedItem财产CustomDataGrid。我希望能够使用Binding这个属性,因为我使用MVVM模式。所以我必须在CustomDataGrid中声明SelectedItemDependencyProperty。但我没有想法山楂树,我可以使其正常...UserControl中的嵌套DataGrid WPF SelectedItem属性

这是怎么DepedencyProperty -s常常声明:

public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
     "SelectedItem", typeof(Object), typeof(CustomDataGrid), 
     new FrameworkPropertyMetadata(default(Object), SelectedItemPropertyCallback) 
     { 
      BindsTwoWayByDefault = true, 
      DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
     }); 

// Optionally 
private static void SelectedItemPropertyCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    // dataGrid - `DataGrid` nested in `UserControl` 
    ((CustomDataGrid)obj).dataGrid.SelectedItem = e.NewValue; 
} 

// Obviously, it has no any link with nested `dataGrid`. This is the problem. 
public Object SelectedItem 
{ 

    get { return GetValue(SelectedItemProperty); } 
    set { SetValue(SelectedItemProperty, value); } 
} 

那么,我该如何正确申报SelectedItem财产?

回答

2

你可以利用从底层对象布线这样的性质对于外部容器

结合框架

例如假设CustomDataGridUserControl

 class CustomDataGrid : UserControl 
     { 
      public CustomDataGrid() 
      { 
       Binding b = new Binding("SelectedItem"); 
       b.Source = this; 
       b.Mode = BindingMode.TwoWay; 
       dataGrid.SetBinding(DataGrid.SelectedItemProperty, b); 
      } 

      public object SelectedItem 
      { 
       get { return (object)GetValue(SelectedItemProperty); } 
       set { SetValue(SelectedItemProperty, value); } 
      } 

      // Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc... 
      public static readonly DependencyProperty SelectedItemProperty = 
       DependencyProperty.Register("SelectedItem", typeof(object), typeof(CustomDataGrid), new PropertyMetadata(null)); 
     } 

我在CustomDataGrid创建了一个名为SelectedItem属性,并设置一个双向绑定到SelectedItem的实际dataGrid里面。

所以这将连接这些属性,并将传播任何来回的变化。

+0

我不能接受硬编码构造函数中的“绑定”。我发现这[链接] http://stackoverflow.com/questions/23381560/wpf-usercontrol-selecteditem-of-a-usercontrol-datagrid-to-bind-to-a-itemsource。它有效,但还不够。如果我想从外部代码设置'SelectedItem',该怎么办?价值将如何传递给'dataGrid'? – monstr

+0

如果您从外部代码中设置SelectedItem,绑定会将值推送到datagrid的SelectedItem。只是试试看。其次写任何这样的代码是一种硬编码,不管你在构造函数,属性设置器,属性改变的事件或任何其他事件处理程序。否则您可以将您的解决方案与链接中的解决方案结合起来,并完成属性的完整布线。 – pushpraj

+0

你对,很好的解决方案,它工作得更好,然后在我发布的链接 – monstr

1

XAML解决方案!

使用此DependencyProperty的:

public object SelectedItem 
{ 
    get { return GetValue(SelectedItemProperty); } 
    set { SetValue(SelectedItemProperty, value); } 
} 

public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(CustomDataGrid), new FrameworkPropertyMetadata(null) 
{ 
    BindsTwoWayByDefault = true, 
    DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
}); 

然后让你的外CustomDataGrid用户控件XAML看起来像这样:

<UserControl x:Class="CustomDataGrid"> 
    <DataGrid ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type CustomDataGrid}}}" 
       SelectedItem="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type CustomDataGrid}}}"> 

    </DataGrid> 
</UserControl> 

然后,您可以使用CustomDataGrid控制相同的方式DataGrid控件绑定的ItemsSource时和SelectedItem到你的视图模型。

+0

。 @monstr这个工程很漂亮,IMO更干净,谢谢bugged87! –

相关问题