WPF将内部DataGrid绑定到不同的Data-Object

时间:2017-10-31 12:21:48

标签: wpf data-binding wpfdatagrid

我想使用resp将嵌套的DataGridRowDetailsTemplate)绑定到不同的数据对象。到外部DataGrid的数据对象。

它适用于外部对象"外部"但是如何访问内部数据对象"内部"。

xaml:

<Window.Resources>
    <local:MainWindowModel x:Key="vm"/>
</Window.Resources>
<Grid Name="grdMain" Height="170" VerticalAlignment="Top" DataContext="{Binding Source={StaticResource vm}}">
    <DataGrid x:Name="datagridOuter"
              ItemsSource="{Binding Outer}"
              AutoGenerateColumns="False"
              Height="170">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Outer"
                                Binding="{Binding Path=Name}"
                                MinWidth="150"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid Name="datagridInner"
                          ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.Inner}"
                          Height="50"
                          AutoGenerateColumns="False"
                          IsReadOnly="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Inner"
                                            Binding="{Binding Path=Name}"
                                            MinWidth="150"/>
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
</Grid>

Item类:

public class Item
{
    public string Name { get; set; }

    public Item ( string name_ )
    {
        this.Name = name_;
    }
} //eoClass

MainWindowModel类:

class MainWindowModel : Notifier
{
    public ObservableCollection<Item> outer;
    public ObservableCollection<Item> Outer
    {
        get { return this.outer; }
        set
        {
            this.outer = value;
            OnPropertyChanged ( "Outer" );
        }
    }

    public ObservableCollection<Item> inner;
    public ObservableCollection<Item> Inner
    {
        get { return this.inner; }
        set
        {
            this.inner = value;
            OnPropertyChanged ( "Inner" );
        }
    }
} //eoClass

1 个答案:

答案 0 :(得分:0)

查找Grid类型的祖先可能非常烦人,因为大多数控件都包含一些嵌套的Grid。我个人试图避免这种情况。

例如,当您查看DataGrid的VisualLiveTree时,您会发现一些事件:

The VisualLiveTree of your <code>DataGrid</code>

你没有得到绑定的原因是FindAncestor将从绑定目标开始,并向上搜索VisualTree中的所有父项,直到它找到第一个Grid。你的grdMain可能是这个链中的最后一个。

所以你已经给了Grid一个名字,就这样使用它。 更改内部ItemSource绑定:

ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.Inner}"

为:

ItemsSource="{Binding ElementName=grdMain, Path=DataContext.Inner}"

会做到这一点。它将在使用名称grdMain指定的元素中查找请求的绑定。

根据您的评论,我回滚了我的答案,以满足您的需求。

  

在MainWindowModel视图中,两个集合Inner和Outer之间没有耦合。耦合在底层数据模型中完成。 &#34;内部&#34;集合在底层数据模型中更新,以便&#34;内部&#34;集合对应于&#34;外部&#34;的实际选择数据。采集。我的问题是,如何应用details-datagrid和&#34; Inner&#34;的绑定。集合。