簡體   English   中英

WPF控件綁定並不總是更新UI

[英]WPF Control binding does not always update UI

我有一個按鈕,其按鈕的IsEnabled屬性在我的視圖模型內綁定到一個值,該值指示當前視圖中的數據是否已被修改。 到目前為止,這種綁定一直工作良好,直到我嘗試將“拖放”功能添加到視圖中的ItemsControl之前。

拖放功能可以正常工作,並且可以完成所有應做的工作。 完成所需的任何數據處理后,它將視圖模型的IsModified屬性設置為true 我已驗證該值實際上設置為true

我遇到的問題是,當從我的Drop方法中更改IsModified屬性時,按鈕的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屬性,應該從命令的CanExecute方法返回bool ,以指示是否應啟用Button 然后,您將在Drop()方法中調用引發該命令的CanExecuteChanged事件的方法。

大多數ICommand實現都包含RaiseCanExecuteChanged()方法或類似方法,您可以調用該方法或類似方法來刷新命令的狀態:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM