绑定到 DataGrid.DataTemplate

Binding to DataGrid.DataTemplate

我正在尝试设置数据网格以包含详细信息行。 DataGrid 正确绑定并显示我的行。问题是当我点击某一行时,我的详细信息行的文本没有显示。我试过将我的详细信息行与相对来源绑定,但没有它。有人可以帮忙吗?

<DataGrid ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MySelectedItem}">
<DataGrid.Columns>
    ... Defined columns
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding MyDetailsText, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
    </DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>

视图模型:

private string myDetailsText;
private TestResultsModel mySelectedItem = null;
private ObservableCollection<TestResultsModel> myObservableCollection = new ObservableCollection<TestResultsModel>();

public ObservableCollection<TestResultsModel> MyObservableCollection
{
    get
    {
        return this.myObservableCollection ;
    }

    set
    {
        this.myObservableCollection = value;

        this.NotifyPropertyChanged(m => m.MyObservableCollection);
    }
}

public TestResultsModel MySelectedItem
{
    get
    {
        return this.mySelectedItem;
    }

    set
    {
        this.mySelectedItem= value;

        this.NotifyPropertyChanged(m => m.MySelectedItem);

        if (value != null && value.Details != null)
            {
                this.MyDetailsText= value.Details.MyDetailsObj.MyDetailsText;
            }
        }
    }
}

public string MyDetailsText
{
    get
    {
        return this.myDetailsText;
    }

    set
    {
        this.myDetailsText= value;

        this.NotifyPropertyChanged(m => m.MyDetailsText);
    }
}

您的相关源似乎需要再向上一级定位,并且需要找到祖先以绑定到您的视图模型。如果在用户控件级别将数据上下文设置为视图模型,则文本块代码应如下所示:

<TextBlock Text="{Binding MyDetailsText, 
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                          AncestorType={x:Type UserControl}}}" />

您提供的代码在获取数据时毫无必要地跳来跳去。 Row 模板可以访问相关的行实例对象(实际上与所选行相同)。

您应该简单地绑定到 MyDetailsText,例如

Text="{Binding MyDetailsText}"

这是一个演示该过程的示例:

<Window.Resources>
    <model:People x:Key="People">
        <model:Person First="Joe"   Last="Smith"   Phone="303-555 5555" />
        <model:Person First="Mary"  Last="Johnson" Phone="720-555 5555" />
        <model:Person First="Frank" Last="Wright"  Phone="202-555 5555" />
    </model:People>
</Window.Resources>
<DataGrid AutoGenerateColumns="False"
          ItemsSource="{StaticResource People}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="First" Binding="{Binding First}" />
        <DataGridTextColumn Header="The Name" Binding="{Binding Last}" />
        <DataGridTextColumn Header="Phone Number" Binding="{Binding Phone}"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
       <DataTemplate>
           <TextBlock Text="{Binding Phone}" />
       </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

结果如下: