我有一个DataGrid
,里面装有许多物体。在该DataGrid中,我有一个RowDetailsTemplate
来容纳所有分层数据。我希望能够从该DataGrid中选择对象,但是到目前为止,使用以下代码没有任何运气
<DataGrid x:Name="leagueList" Grid.Row="1" ItemsSource="{Binding Leagues}" SelectedItem="{Binding SelectedLeague}"
Margin="0,0,5,0" ColumnWidth="1*"
CanUserAddRows="False" AutoGenerateColumns="False" IsReadOnly="True" CanUserReorderColumns="False" CanUserSortColumns="False">
<DataGrid.Resources>
<utility:SubtractValueConverter x:Key="SubtractValueConverter"/>
</DataGrid.Resources>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.Columns>
<DataGridTextColumn Header="League" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Initials" Binding="{Binding Initials}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate DataType="{x:Type models:Team}">
<DataGrid ItemsSource="{Binding Teams}" SelectedItem="{Binding Path=SelectedTeam, UpdateSourceTrigger=PropertyChanged}"
CanUserAddRows="False" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All"
Width="{Binding ActualWidth,ElementName=leagueList, Converter={StaticResource SubtractValueConverter}, ConverterParameter=50}" HorizontalAlignment="Stretch" ColumnWidth="*" Margin="1,1,1,1" BorderThickness="2">
<DataGrid.Columns>
<DataGridTextColumn Header="Nickname" Binding="{Binding Nickname}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
SelectedTeam
属性是我想在选择Team
时被调用的属性,但是它似乎并没有绑定到该属性,即使我是这样指定的。
public Team SelectedTeam
{
get => _SelectedTeam;
set
{
_SelectedTeam = value;
System.Windows.MessageBox.Show("Selected Team is: " + _SelectedTeam.Nickname);
RaisePropertyChangedEvent("SelectedTeam");
}
}
运行我的应用程序时,选择团队时我什至都没有弹出MessageBox
弹出窗口,但是我应该。
整个网格正确填充,我只是无法从内部DataGrid中获取SelectedItem。
答案 0 :(得分:0)
由于它位于模板内部,因此很难绑定所选项目, 您可以使用RelativeSource,下面是语法和示例。
SelectedItem = {Binding Path=SelectedTeam, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
typeOfAncestor:-Ancestor的类型是您在Xaml的声明中为其提供名称空间(即视图模型的名称空间)的类的类型。
例如:
xmlns:local="clr-namespace:WpfApp2"
它必须位于xaml页面的顶部
SelectedItem = {Binding Path=SelectedTeam, RelativeSource={RelativeSource AncestorType={x:Type local:ViemModelName}}}
相对来源指向或指向该属性。 现在发生的是,SelectedTeam从视图模型绑定到此Selected Item属性。
希望这对您有所帮助。 谢谢,
答案 1 :(得分:0)
使用Jan的评论link和Satish的回答后,我找到了解决方案。
子项DataGrid
需要找到其父项的DataContext,因此可以使用RelativeResource
指向UserControl
类型,然后在DataContext
之前插入SelectedItem
我的财产类型。因此,SelectedItem="{Binding Path=DataContext.SelectedTeam, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
行代码如下所示:
pd.Series.diff