gpt4 book ai didi

c# - 如何在多个 View 之间共享一个绑定(bind)值?

转载 作者:行者123 更新时间:2023-12-03 10:25:32 25 4
gpt4 key购买 nike

我是 WPF 和 MVVM 的新手(来自 WinForms 和 Events),所以请多多包涵!

我想弄清楚如何使用相同的INotifyPropertyChanged多个 View 之间的值绑定(bind)。我正在使用 MVVM Light。我的 ViewModel 继承自 ViewModelBase支持我的观点(没有后面的代码)。我不确定如何解释这个问题,但我认为一个例子可以清楚地说明我所追求的。

我有一个主窗口。它有一个标准 TabControl .在登录 TabItem我有一个自定义登录控件。低于TabControl ,我有一个自定义状态栏控件。期望的行为是,当用户登录时,状态栏会更新他们的登录状态和名称,而另一个 TabItem主窗口上的 s 已启用(未登录时应禁用它们)。

所以总结一下,我有:

  • MainWindow( View )与 MainWindowViewModel
  • 使用 LoginViewModel 登录(查看)(在 MainWindow 的 TabControl 中)
  • 带有 StatusBarViewModel 的 StatusBar( View )(位于 MainWindow 底部)

  • 这是我的 StatusBarViewModel好像:
    public class StatusBarViewModel : ViewModelBase, IStatusBarViewModel
    {
    private bool _isLoggedIn;
    public bool IsLoggedIn
    {
    get { return _isLoggedIn; }
    set { Set(ref _isLoggedIn, value); RaisePropertyChanged(); }
    }
    // other properties follow
    }

    我注入(inject)(使用 Ninject) IStatusBarViewModel 的(单例)具体实例通过构造函数注入(inject)进入 LoginViewModel:
    public class LoginViewModel : ViewModelBase
    {
    private IStatusBarViewModel _statusBar;

    public LoginViewModel(IStatusBarViewModel statusBar)
    {
    _statusBar = statusBar;
    }
    }

    我对 MainWindowViewModel 做同样的事情:
    public class MainWindowViewModel : ViewModelBase
    {
    private IStatusBarViewModel _statusBar;

    public bool IsLoggedIn => _statusBar.IsLoggedIn;

    public MainWindowViewModel(IStatusBarViewModel statusBar)
    {
    _statusBar = statusBar;
    }
    }

    注意:我认为这是我的问题所在......不确定 MVVM Light 是否将其解释为可绑定(bind)属性并应用正确的更改通知。如果我添加一个 setter(我在这里不需要),那将不起作用,因为 A property or indexer may not be passed as an out or ref parameter .所以我不清楚当我这样做时发生了什么。

    回到正轨,所以当登录成功时,我可以更新 IsLoggedIn来自 LoginViewModel 的属性(property)像这样:
    _statusBar.IsLoggedIn = true;

    我在我的 MainWindow XAML 中设置了绑定(bind),如下所示:
    <TabItem Header="Event" IsEnabled="{Binding IsLoggedIn}">
    <views:Events/>
    </TabItem>

    首次加载 View 时绑定(bind)正常工作,但随后对属性的更改不会触发 IsEnabled 中的更改.但是,状态栏( View )会相应更新。

    我曾考虑将 StatusBarViewModel 和 MainWindowViewModel 的引用注入(inject)到我的 LoginViewModel 中(然后在登录后必须设置两个属性),但这让我认为我没有正确处理这个问题,因为我正在创建依赖关系。

    所以基本上问题是:
  • 根据 MVVM 模式,我的方法是否正确?
  • 我是否走在正确的轨道上,只需要稍微修改一下代码吗?
  • 如果不是,那么处理这种情况的(或一种)标准模式是什么?
  • 最佳答案

    你的猜测是正确的。问题在这里:

    public bool IsLoggedIn => _statusBar.IsLoggedIn;

    ...因为它不会生成更改通知。您可以做的只是通过公共(public)属性公开 IStatusBarViewModel,然后直接绑定(bind)到它自己的 IsLoggedIn 属性。

    在 View 模型中:
    public class MainWindowViewModel : ViewModelBase
    {
    private IStatusBarViewModel _statusBar;
    public IStatusBarViewModel StatusBar => _statusBar;
    public MainWindowViewModel(IStatusBarViewModel statusBar)
    {
    _statusBar = statusBar;
    }
    }

    在 View 中:
    <TabItem Header="Event" IsEnabled="{Binding StatusBar.IsLoggedIn}">
    <views:Events/>
    </TabItem>

    关于c# - 如何在多个 View 之间共享一个绑定(bind)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316258/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com