繁体   English   中英

从一个 ViewModel 到另一个 ViewModel 获取 PropertyChanged 通知

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM