我有一个按钮,其IsEnabled
属性在我的视图模型中绑定到一个值,该值指示当前视图中的数据是否已被修改。到目前为止,这个绑定工作正常,直到我尝试将拖放功能添加到视图中的ItemsControl。
拖放功能工作正常,并完成它应该做的一切。当它完成所需的任何数据操作时,它将View Model的IsModified
属性设置为true
。我已经确认该值实际设置为true
。
我遇到的问题是,当IsModified
属性从我的Drop
方法中更改时,按钮的IsEnabled
属性不会更新;当在拖放操作期间将IsModified
设置为true
时,该按钮将保持禁用状态。如果我单击该按钮,它会突然更新并启用,要求我再次按下该按钮以实际按预期执行。
在itemsControl项目的Drop
事件上调用Drop
方法。这是从另一个线程调用还是没有通知UI属性更改?我试过找到支持文档,但是遇到了一些麻烦。
再次,设置IsModified
属性在任何其他情况下继续工作并正确更新UI。
有问题的代码非常简单。
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;
}
您应该从命令的IsEnabled
方法返回bool
而不是绑定CanExecute
属性,以指示是否应启用Button
。然后,您将调用一个方法,在您的CanExecuteChanged
方法中引发命令的Drop()
事件。
大多数ICommand
实现包括RaiseCanExecuteChanged()
方法或类似的,您可以调用以刷新命令的状态:
public void Drop()
{
...
SaveChangesCommand.RaiseCanExecuteChanged();
}