[英]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.