WPF:DataGrid.RowDetailsTemplate:如果选择了单行,则仅显示详细信息?

时间:2014-05-26 11:45:40

标签: wpf xaml datagrid rowdetailstemplate

我正在RowDetailsTemplate之一使用DataGrids。到目前为止这个工作正常,但是当用户想要为特定操作选择多行时看起来很奇怪。 只有在只选择了一行时才有显示RowDetailsTemplate的简单方法吗?

我想用纯XAML来解决这个问题。否则我会用后面的代码来做:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid temp = sender as DataGrid;

    if (temp.SelectedItems.Count == 1)
    {
        temp.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
    }
    else
    {
        temp.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed;
    }
}

2 个答案:

答案 0 :(得分:1)

DataGrid有一个属性 RowDetailsVisibilityMode 。选择多行时,将其设置为 Collapsed 。 您的XAML应该类似于

<DataGrid Name="dataGrid1" RowDetailsVisibilityMode="{Binding Path=SelectedItems.Count, RelativeSource={RelativeSource Self}, Converter={StaticResource rdtvc}}">

和相应的转换器一样

public class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if (value != null && (int)value == 1)
            return DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
        else 
            return DataGridRowDetailsVisibilityMode.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:0)

基于user1994514的答案,我开发了仅XAML版本,不需要转换器。如果有人想避免使用额外的转换器,则可以使用带有数据触发器的样式来达到相同的效果。

    <DataGrid>
        <DataGrid.Style>
            <Style TargetType="DataGrid">
                <Setter Property="RowDetailsVisibilityMode" Value="Collapsed" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItems.Count, RelativeSource={RelativeSource Self}}" Value="1">
                        <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Style>
    </DataGrid>