WPF控件绑定并不总是更新UI

时间:2019-04-16 12:21:42

标签: c# wpf data-binding

我有一个按钮,其视图模型内的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;
}

1 个答案:

答案 0 :(得分:1)

您应该从命令的IsEnabled方法返回bool来代替CanExecute属性,以指示是否应启用Button。然后,您将在CanExecuteChanged方法中调用引发该命令的Drop()事件的方法。

大多数ICommand实现都包含一个RaiseCanExecuteChanged()方法或类似方法,您可以调用该方法或类似方法来刷新命令的状态:

public void Drop()
{
    ...
    SaveChangesCommand.RaiseCanExecuteChanged();
}