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

问题描述 投票:0回答:1

我有一个按钮,其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;
}
c# wpf data-binding
1个回答
1
投票

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

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

public void Drop()
{
    ...
    SaveChangesCommand.RaiseCanExecuteChanged();
}
© www.soinside.com 2019 - 2024. All rights reserved.