Как я могу изменить привязку DataGridColumn для выбранного элемента?

#c# #wpf #xaml #datagrid

#c# #wpf #xaml #datagrid

Вопрос:

Допустим, у меня есть a DataGrid , который привязан к коллекции объектов. Эти объекты имеют свойства PropertyA и PropertyB . Я хочу, чтобы отображался 1-й столбец PropertyA , но когда я выбираю строку, я хотел, чтобы отображалась только выбранная строка PropertyB . Как я могу это сделать?

Объект

 public class MyObject
{
  public string PropertyA { get; set; }
  public string PropertyB { get; set; }
}
  

xaml

 <DataGrid ItemsSource="{Binding Path=MyObjects}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Foo" Binding="{Binding Path=PropertyA}" />
  </DataGrid.Columns>
</DataGrid>
  

При этом отображается значение в PropertyA для каждой строки в datagrid. Но когда я выбираю строку, я хочу, чтобы эта строка менялась только на отображение PropertyB.

Ответ №1:

Попробуйте это:

XAML:

    Window x:Class="WpfApplication296.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication296"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">

    <Window.Resources>

        <DataTemplate x:Key="TemplateA">
            <TextBlock Text="{Binding PropertyA}" FontSize="24" />
        </DataTemplate>

        <DataTemplate x:Key="TemplateB">
            <TextBlock Text="{Binding PropertyB}" FontSize="24"/>
        </DataTemplate>

        <Style x:Key="DataGridCellStyle1" 
               TargetType="{x:Type DataGridCell}" 
               BasedOn="{StaticResource {x:Type DataGridCell}}">
            <Setter Property="ContentTemplate" Value="{StaticResource TemplateA}"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource TemplateB}"/>
                </Trigger>
            </Style.Triggers>
        </Style>

    </Window.Resources>

    <Window.DataContext>
        <local:MyViewModel/>
    </Window.DataContext>

    <Grid>

        <DataGrid ItemsSource="{Binding MyObjects}" 
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Foo" 
                                    Width="*"
                                    Binding="{Binding PropertyA}" 
                                    CellStyle="{StaticResource DataGridCellStyle1}" />
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>
  

ViewModel:

 public class MyViewModel
{
    public ObservableCollection<MyObject> MyObjects { get; set; }

    public MyViewModel()
    {
        MyObjects = new ObservableCollection<MyObject>
        {
            new MyObject {PropertyA = " AAA 101", PropertyB=" BBBBBB 001" },
            new MyObject {PropertyA = " AAA 102", PropertyB=" BBBBBB 002" },
            new MyObject {PropertyA = " AAA 103", PropertyB=" BBBBBB 003" },
            new MyObject {PropertyA = " AAA 104", PropertyB=" BBBBBB 004" },
            new MyObject {PropertyA = " AAA 105", PropertyB=" BBBBBB 005" },
        };
    }
}
  

введите описание изображения здесь