我的“父”視圖模型 ( AnalyzeVm) 有一個子視圖模型 ( ScanVm),它代表可以保存到磁盤的東西。我想給父母一個命令(SaveCmd),只有當ScanVm.IsDirty屬性為真時才啟用。
我已經在各處使用DelegateCommand它的功能,所以我嘗試使用它。ObservesProperty但在這種情況下,我無法讓ObservesProperty運算式觸發對CanExecute.
這里的區別(與我使用的所有其他地方都ObservesProperty可以正常作業)是我正在監視子物件的屬性。不是我自己的
我需要了解為什么這不起作用。我認為這是一件有效的事情。
這是兩個視圖模型(為清楚起見,已洗掉)
// Parent view-model. Derives from a class that implements INotifyPropertyChanged.
public class AnalyzeVm : BaseViewModel
{
private ScanVm _scan;
public AnalyzeVm(ScanVm scan)
{
_scan = scan;
// Set up the command. Try to make it monitor a property of the ScanVm
// object instead of one of our own.
SaveScanCmd = new DelegateCommand(
() => { _scan.Save() } // execute -- saves the scan
() => { return _scan.IsDirty; }) // only valid when scan is dirty
.ObservesProperty(() => scan.IsDirty); // So observe IsDirty property
// Now just as a sanity check, add a handler for that property changing
// to the PropertyChangedEventManager and log when it does.
PropertyChangedEventManager.AddHandler(
scan,
(_, _) => Debug.WriteLine("IsDirty changed"),
nameof(ScanContext.IsDirty));
}
public ICommand SaveScanCmd { get; }
// other code...
}
// ScanVm class.
public class ScanVm : BaseViewModel
{
private bool _isDirty;
public bool IsDirty
{
get => _isDirty;
set => SetProperty(ref _isDirty, value); // Raises PropertyChanged event
}
public void Save()
{
// Code here to save the ScanVm
IsDirty = false; // No longer dirty
}
// ... other code
}
我確信該IsDirty屬性正在正確更改并觸發事件。我多次確認。Observes當我觀察自己班級的屬性時,我已經成功地使用了屬性。例如,我將把SaveCmd它移動到ScanVm類本身中——這樣屬性運算式就可以觀察到ScanVm's own property,然后它就可以正常作業了。我在我的代碼中到處都是這樣做的。
這是我試圖觀察另一個物件的屬性的唯一地方。這樣做有效嗎?如果是這樣,我做錯了什么?
uj5u.com熱心網友回復:
ObservesProperty主要作用于包含物件的屬性
public bool IsDirty {...}
...ObservesProperty( () => IsDirty );
加上嵌套屬性
public ScanVM Child {...}
...ObservesProperty( () => Child.IsDirty );
它只是不觀察任何給定實體的屬性,因為它從包含物件開始查找(AnalyzeVm在這種情況下)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458850.html
上一篇:使用單個Windows提示符洗掉多個檔案(FileSystem)
下一篇:WPF切換視圖
