MVVM的问题,绑定没有显示

时间:2016-04-18 17:59:43

标签: c# wpf mvvm

我正在尝试实现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时。

我错过了什么?

2 个答案:

答案 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一次,它将传播到窗口中的所有其他控件。