我有一个按钮,其视图模型内的IsEnabled
属性绑定到一个值,该值指示当前视图中的数据是否已被修改。到目前为止,这种绑定一直很好,直到我尝试将“拖放”功能添加到视图中的ItemsControl上。
“拖放”功能可以正常工作,并且可以完成所有应做的工作。完成所需的任何数据处理后,它将视图模型的IsModified
属性设置为true
。我已验证该值实际上是 设置为true
。
问题,我遇到的问题是,当从IsModified
方法中更改Drop
属性时,按钮的IsEnabled
属性却没有更新;在拖放操作期间将IsModified
设置为true
时,按钮保持禁用状态。如果我单击该按钮,它会突然更新并启用,要求我再次按一下按钮才能真正按预期进行。
在ItemsControl项目的Drop
事件上调用Drop
方法。这是从另一个线程调用的还是没有通知UI属性更改的东西?我曾尝试找到支持文档,但遇到了一些麻烦。
再一次,设置IsModified
属性在任何其他情况下都可以继续工作,并且可以正确更新用户界面。
有问题的代码非常简单。
XAML:
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<EventSetter Event="DragEnter" Handler="IcFields_DragEnter"/>
<EventSetter Event="Drop" Handler="IcFields_Drop"/>
</Style>
</ItemsControl.ItemContainerStyle>
...
...
...
<Button Margin="5" Padding="10,0,10,0" IsEnabled="{Binding IsModified}"
Command="{Binding SaveChangesCommand}">Save Changes</Button>
其中IcFields_Drop
处理程序允许对模型进行更改,最后将IsModified
设置为true
。
编辑:
这是该实现的简化示例。使用上面的XAML作为本示例的XAML。
C#-代码隐藏
private void IcFields_Drop(object sender, DragEventArgs e)
{
ViewModel.Drop();
}
C#-查看模型
private bool isModified;
public bool IsModified
{
get { return isModified; }
set { SetProperty(ref isModified, value); }
}
public void Drop()
{
//PSEUDO: Do some drag/drop logic for the items attached to the ItemsControl.
...
...
IsModified = true;
}
答案 0 :(得分:1)
您应该从命令的IsEnabled
方法返回bool
来代替CanExecute
属性,以指示是否应启用Button
。然后,您将在CanExecuteChanged
方法中调用引发该命令的Drop()
事件的方法。
大多数ICommand
实现都包含一个RaiseCanExecuteChanged()
方法或类似方法,您可以调用该方法或类似方法来刷新命令的状态:
public void Drop()
{
...
SaveChangesCommand.RaiseCanExecuteChanged();
}