+-
我刚刚开始玩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。