从RowDetailsTemplate中的DataGrid无法访问SelectedItem

时间:2018-10-01 00:36:46

标签: c# mvvm

我有一个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。

2 个答案:

答案 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