我有一个带按钮的社区工具包数据网格。单击按钮会触发一个事件,该事件调用一个方法来更新绑定到按钮文本的
Selected
属性。绑定项是 SelectedAssignUsersGrid
属性绑定到数据网格的 SelectedItem
.
我的目标是一旦
Selected
属性以编程方式更改,按钮的文本将在数据网格 UI 中更新。问题是在大多数情况下,当属性发生变化时它不会改变,但这很古怪。如果我双击该按钮,它有时会发生变化,但并不总是与实际属性值匹配。数据网格是古怪到无可救药的地步,还是有办法让 UI 在绑定属性发生变化时与它们匹配?
XAML 数据网格:
<controls:DataGrid x:Name="dataGridAssignUsers_Temp"
Margin="12" GridLinesVisibility="All" HorizontalGridLinesBrush="PowderBlue" VerticalGridLinesBrush="PowderBlue"
BorderBrush="PowderBlue" ScrollViewer.HorizontalScrollBarVisibility="Auto"
AutoGenerateColumns="False"
SelectedItem="{x:Bind ViewModel.SelectedAssignUsersGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{x:Bind ViewModel.AssignUsersGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<controls:DataGrid.Columns>
<controls:DataGridTemplateColumn Header="Select" Width="75">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="viewmodels:ProjectViewModel">
<Grid>
<Button Click="DataGridAssignUserSelect_Click" HorizontalContentAlignment="Left"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<TextBlock>
<Run FontSize="12" Text="{Binding Selected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</TextBlock>
</Button>
</Grid>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
<controls:DataGridTextColumn IsReadOnly="True"
Header="AD User Name"
Width="250"
Binding="{Binding UserAdazureAduserName}"
FontSize="14" />
<controls:DataGridTextColumn IsReadOnly="False"
Header="User Initials"
Width="250"
Binding="{Binding AppUserInitials}"
FontSize="14" />
</controls:DataGrid.Columns>
</controls:DataGrid>
代码隐藏事件:
private void DataGridAssignUserSelect_Click(object sender, RoutedEventArgs e)
{
ViewModel.SelectAssignableUser();
dataGridAssignUsers.UpdateLayout();
}
ViewModel 从上面的事件中调用的代码:
public partial class ProjectViewModel : ObservableObject, IDisposable
{
...
[ObservableProperty]
private ObservableCollection<TempUser> _assignUsersGrid; //Project users datagrid source.
[ObservableProperty]
public TempUser _selectedAssignUsersGrid = new(); //Item selected in the datagrid.
public void SelectAssignableUser()
{
if (SelectedAssignUsersGrid is null) return;
SelectedAssignUsersGrid.Selected = !SelectedAssignUsersGrid.Selected;
}
...
}
作为参考,这里是网格绑定的底层模型类:
public class TempUser
{
public bool Selected { get; set; }
public string AppUserInitials { get; set; }
public string UserAdazureAduserName { get; set; }
public TempUser() { }
}