![](/img/trans.png)
[英]get value of a property from one viewmodel's current instance in another
[英]Get PropertyChanged notification from one ViewModel to another
我正在做我的第一个 WPF 项目。 我的用户界面需要更具交互性。 我有 2 个视图模型。 MainWindowViewModel 和 WorldViewModel。
MainWindow xaml 简化代码:
<Window>
[...]
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid>
<!--Worlds combobox-->
<ComboBox Margin="2 0 0 0" MinWidth="100" IsEnabled="{Binding IsWorldsComboEnabled}"
ItemsSource="{Binding WorldViewModel.Worlds}" SelectedValue="{Binding WorldViewModel.CurrentWorld}"
DisplayMemberPath="Name"/>
</Grid>
</Window>
MainWindowViewModel.cs 代码:
public class MainWindowViewModel : BaseViewModel
{
public WorldViewModel WorldViewModel { get; set; }
public bool IsWorldsComboEnabled => WorldViewModel.Worlds != null;
/// <summary>
/// Default constructor
/// </summary>
public MainWindowViewModel()
{
WorldViewModel = WorldViewModel.Instance;
}
}
WorldViewModel.cs 代码:
public class WorldViewModel : BaseViewModel
{
public ObservableCollection<World> Worlds { get; set; }
public World CurrentWorld { get; set; }
public static WorldViewModel Instance { get; set; }
// Called on startup
public static void Initialize()
{
Instance = new WorldViewModel();
}
/// <summary>
/// Default constructor
/// </summary>
public WorldViewModel()
{
}
}
ViewModels 有点大,但这是最少需要的代码。 BaseViewModel
是一个类,它通过PropertyChanged.Fody
NuGet 包提供 NotifyPropertyChanged 接口。
当Worlds
ObservableCollection 为 null 时,必须禁用我的ComboBox
。 当IsWorldsComboEnabled
位于WorldViewModel
时效果很好,但我觉得这不是一条路。 多个视图将取决于WorldViewModel
但它们不需要IsWorldsComboEnabled
属性。 所以它的位置在MainWindowViewModel
。
当WorldViewModel
中的属性发生变化时,有什么方法可以通知MainWindowViewModel
吗?
下面这行代码的问题是,即使WorldViewModel.Worlds
改变, IsWorldsComboEnabled
的 setter 也永远不会执行,因此你的PropertyChangedEventHandler
不会被调用。
public bool IsWorldsComboEnabled => WorldViewModel.Worlds != null
您可能会更改为public bool IsWorldsComboEnabled { get; set; }
public bool IsWorldsComboEnabled { get; set; }
public bool IsWorldsComboEnabled { get; set; }
和评估下面的表达式
IsWorldsComboEnabled = WorldViewModel.Worlds != null;
每当您更改 WorldViewModel.Worlds 属性时。
在您的情况下,属性是ObservableCollection
,您可能会注册到 CollectionChanged 事件
WorldViewModel.Worlds.CollectionChanged += MyCollectionChangedMethod;
并在那里评估表达式
private void MyCollectionChangedMethod(object sender, NotifyCollectionChangedEventArgs e)
{
IsWorldsComboEnabled = WorldViewModel.Worlds != null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.