wpf - 组合框 SelectionChanged 事件绑定
问题描述
我有以下 xaml:
<DataGridTemplateColumn Header="123">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Role}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=DataContext.Roles,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding Path = DataContext.UpdateUserCommand}" /> // bind fails there
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
问题是我的命令没有在更改时运行,但是如果将组合框定义移出数据网格,我的命令将成功触发。好像我的绑定错了,但我不知道出了什么问题。
解决方案
只需将 ComboBox 的SelectedItem
属性绑定到SelectedRole
视图模型中的属性即可。
为了在视图模型属性更改时运行异步操作,只需在视图模型中附加一个异步 PropertyChanged 事件处理程序:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ViewModel()
{
PropertyChanged += async (s, e) =>
{
if (e.PropertyName == nameof(SelectedRole))
{
await SomeAsyncAction();
}
};
}
private Role selectedRole;
public Role SelectedRole
{
get { return selectedRole; }
set
{
selectedRole = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(SelectedRole)));
}
}
private async Task SomeAsyncAction()
{
...
}
}
推荐阅读
- c - 在不使用 STL 的情况下为下限和上限找到合适的 C 代码时遇到麻烦
- python - time.sleep 对线程访问的影响
- javascript - 视差滚动绑定动画,以不同的速度制作动画
- ios - 在 Swift 语言和 Realm 数据库中声明日期对象时,是否需要格式化日期?
- python - 使用 Kosaraju 算法的图中强连通分量 (SCC) 的大小(边数)
- sql - 当发生变化时如何跟踪数据库中的变化?
- javascript - 如何显示功能组件列表
- google-cloud-platform - 在 stackdriver 上监控 VM 进程
- javascript - JS:Facebook 登录:如何从不同的页面调用 FB.logout()?
- azure - 为什么不能通过 Azure 的 API 获得数据