绑定到 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>
结果如下:
我正在尝试设置数据网格以包含详细信息行。 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>
结果如下: