我正在尝试实现Model View Viewmodel。但是我无法让它发挥作用。
这是我的模型和基类:
for (var i = 0; i < values.length; i++) {
if (values[i].Routenumber == "" || values[i].SerialNumber == "None") {
count = count + 1;
}
}
这是我的viewmodel:
namespace GridCity.GUI {
class DateInfoModel : PropertyChangedBase {
private string _Date = string.Empty;
public string Date {
get {
return _Date;
}
set {
if (_Date != value) {
_Date = value;
OnPropertyChanged(nameof(Date));
System.Console.WriteLine(_Date);
}
}
}
}
}
namespace GridCity.GUI {
using System.ComponentModel;
public abstract class PropertyChangedBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected internal void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
System.Console.WriteLine("OnPropertyChanged: " + propertyName);
}
}
}
这是我的观点:
namespace GridCity.GUI {
class DateInfoViewModel : PropertyChangedBase {
public DateInfoViewModel(DateInfoModel model) {
Model = model;
}
public DateInfoModel Model { get; private set; }
}
}
我在MainWindow构造函数中设置<UserControl x:Class="GridCity.GUI.DateInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GridCity.GUI"
mc:Ignorable="d"
d:DesignHeight="60" d:DesignWidth="150">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0" FontWeight="ExtraBold" Content="{Binding Model.Date}"></Label>
<Label Grid.Row="1" Grid.Column="0" FontWeight="ExtraBold" Content="TEST"></Label>
</Grid>
</UserControl>
:
view.DataContext
我可以看到第二个标签(public MainWindow() {
InitializeComponent();
DateInfoView view = new DateInfoView();
Game.DateInfoModel = new DateInfoModel();
DateInfoViewModel viewModel = new DateInfoViewModel(Game.DateInfoModel);
view.DataContext = viewModel;
}
),因此用户控件似乎在理论上有效。但是我在第一个标签中看不到任何内容。我可以在控制台上看到输出,但更改TEST
并调用_Date
时。
我错过了什么?
答案 0 :(得分:1)
更改
view.DataContext = viewModel;
到
this.DataContext = viewModel;
如果UserControl位于那个
,你需要设置MainWindow的DataContext答案 1 :(得分:1)
您似乎有两个DateInfoView
个实例。您在XAML中定义的一个,以及您在代码中创建的一个。您设置后者的DataContext
但不使用它。你可以通过几种方式解决它
解决方案1
设置整个DataContext
的{{1}},将Window
值传递给DataContext
UserControl
但正如您所说,您希望不同的控件具有不同的上下文
解决方案2
在XAML中提供public MainWindow()
{
InitializeComponent();
Game.DateInfoModel = new DateInfoModel();
this.DataContext = new DateInfoViewModel(Game.DateInfoModel);
}
名称
UserControl
并在后面的代码中使用它
<xx:DateInfoView ... x:Name="myUserControl"/>
我会建议第三个解决方案,您可以在其中创建更大的视图模型,将较小的视图模型作为其属性,将其设置为整个窗口的public MainWindow()
{
InitializeComponent();
Game.DateInfoModel = new DateInfoModel();
myUserControl.DataContext = new DateInfoViewModel(Game.DateInfoModel);
}
并在XAML绑定中{{1特定DataContext
的大型视图模型的属性。就像你必须只设置DataContext
一次,它将传播到窗口中的所有其他控件。