#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" },
};
}
}