XAML DataGrid 中的 WPF 项选择
XAML WPF item selection in DataGrid
我正在调试我作为实习生工作的公司的一位前员工编写的代码。
原来是 DataGrid 没有选择项目。每次我尝试访问 DataGrid.SelectedItem
它 returns 我 null
,即使选择了一行。
As you can see in this print
遵循 XAML 代码:
<DataGrid x:Name="SchedulesDataGrid"
Grid.Row="1"
Margin="0 10 0 0"
AlternatingRowBackground="LightSteelBlue"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserResizeColumns="False"
CanUserAddRows="False"
CanUserResizeRows="False"
SelectionMode="Single"
SelectionUnit="CellOrRowHeader"
AutoGenerateColumns="False"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding AssemblySchedules, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="False"
Width="200">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Type"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleTypeComboBox"
IsSynchronizedWithCurrentItem="True"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Category"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Categories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedCategory, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleCategoryComboBox"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="View template"
Width="250">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ScheduleTemplates, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedScheduleTemplate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleTemplateComboBox"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Phase"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Phases, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedPhase, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="SchedulePhase"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我是不是漏掉了什么?
我在互联网上读到 PropertyChanged 绑定是必要的,但我相信它已经以正确的方式完成。
DataGrid print screen
会不会是因为我必须点击行中的名称,所以 SelectedItem 没有被“触发”?
这是我初始化数据网格的方式
<DataGrid MaxHeight="450"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
ItemsSource="{Binding Results}"
SelectedItem="{Binding SelectedResult}">
然后在 ViewModel 中我有这个
private Data selectedResult;
public Data SelectedResult
{
get { return selectedResult; }
set
{
if (selectedResult != value)
{
selectedResult = value;
RaisePropertyChanged(nameof(SelectedResult));
}
}
}
Data 作为 DataGrid 列的模型
好吧,基本上我不得不改变一些东西。
不知道为什么以及如何我的数据网格的选择部分停止工作。所以我为其创建了另一列,并为数据网格的每一行添加了一个删除按钮。
获取我在按钮 On_Click 方法中使用的行 (sender as Button).DataContext
并将其从数据网格源列表中删除。
我正在调试我作为实习生工作的公司的一位前员工编写的代码。
原来是 DataGrid 没有选择项目。每次我尝试访问 DataGrid.SelectedItem
它 returns 我 null
,即使选择了一行。
As you can see in this print
遵循 XAML 代码:
<DataGrid x:Name="SchedulesDataGrid"
Grid.Row="1"
Margin="0 10 0 0"
AlternatingRowBackground="LightSteelBlue"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserResizeColumns="False"
CanUserAddRows="False"
CanUserResizeRows="False"
SelectionMode="Single"
SelectionUnit="CellOrRowHeader"
AutoGenerateColumns="False"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding AssemblySchedules, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="False"
Width="200">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Type"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleTypeComboBox"
IsSynchronizedWithCurrentItem="True"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Category"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Categories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedCategory, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleCategoryComboBox"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="View template"
Width="250">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ScheduleTemplates, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedScheduleTemplate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="ScheduleTemplateComboBox"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Phase"
Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Phases, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedPhase, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
x:Name="SchedulePhase"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我是不是漏掉了什么?
我在互联网上读到 PropertyChanged 绑定是必要的,但我相信它已经以正确的方式完成。
DataGrid print screen
会不会是因为我必须点击行中的名称,所以 SelectedItem 没有被“触发”?
这是我初始化数据网格的方式
<DataGrid MaxHeight="450"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
ItemsSource="{Binding Results}"
SelectedItem="{Binding SelectedResult}">
然后在 ViewModel 中我有这个
private Data selectedResult;
public Data SelectedResult
{
get { return selectedResult; }
set
{
if (selectedResult != value)
{
selectedResult = value;
RaisePropertyChanged(nameof(SelectedResult));
}
}
}
Data 作为 DataGrid 列的模型
好吧,基本上我不得不改变一些东西。
不知道为什么以及如何我的数据网格的选择部分停止工作。所以我为其创建了另一列,并为数据网格的每一行添加了一个删除按钮。
获取我在按钮 On_Click 方法中使用的行 (sender as Button).DataContext
并将其从数据网格源列表中删除。