+-
如何在另一个C#类的视图模型中访问变量。

我刚刚开始玩C#和视图模型,但在XAML文件中很难得到一个变量的值输出到一个文本块。

所以我有一个名为ReplayControlViewModel.cs的视图模型,它有。

public class ReplayControlViewModel : ABCObservableObject

在这个类里面,我创建了以下内容。

public string overallBestSessionLap { get => Get<string>(); set => Set(value); }

并在下面的一个函数中使用它。

private void MessageHandler_OnBroadcastingEvent(string sender, BroadcastingEvent evt)
{
  if (evt.Type == BroadcastingCarEventType.BestPersonalLap)
            // record best lap
            overallBestSessionLap = evt.Msg;
}

然后我有另一个名为SessionInfoViewModel.cs的视图模型,它有:

public class SessionInfoViewModel : ABCObservableObject

... 和一个相关的XAML文件(SessionInfoView.xaml)

我试着按如下方式访问变量,但在GUI中没有任何显示......。

<TextBlock Text="{Binding overallBestSessionLap}" Margin="5,1"/>

我尝试了几种不同的方法,包括把类名放在前面,但似乎还是不行。我相信这一定很简单,但如果有人能告诉我哪里出了问题,我会很感激。

谢谢你,布拉德

EDIT(解决方案)。作为参考,我发现在我的... MainWindow.xaml 这让我对绑定的工作原理有了更好的了解。

<Window.DataContext>
    <local:MainViewModel />
</Window.DataContext>

<Broadcasting:SessionInfoView DataContext="{Binding SessionInfoVM}" Grid.Column="1" Grid.Row="0" />
<Broadcasting:ReplayControlView DataContext="{Binding ReplayVM}" Grid.Column="1" Grid.Row="1" />

而在 MainViewModel.cs 它有这个....

public class MainViewModel : ABCObservableObject
{
    public SessionInfoViewModel SessionInfoVM { get; }
    public ReplayControlViewModel ReplayVM { get; }

    public MainViewModel()
    {
        SessionInfoVM = new SessionInfoViewModel();
        ReplayVM = new ReplayControlViewModel();
    }
}
0
投票

就像Krzysztof所说的那样,阅读WPF中的绑定和数据上下文是个好主意。

这里还有一点需要注意的是变更通知。当你设置视图绑定的属性值时,你需要引发一个PropertyChanged事件。视图会 "监听 "该事件,并将更新视图。

试图从一个viewmodel中改变另一个viewmodel的属性值是不典型的。为了支持模块化,视图模型被设计成大部分是孤立的(虽然有一些例外)。视图模型的通信通常是通过Messenger来完成的。

我建议研究一下WPF的MVVM框架。周围有很多,比如Prism,或者MVVM Light。这些例子可能会有帮助,并且可以去除一些 "管道"。但是做一些OnPropertyChanged的实现有助于更好的理解WPF。