0

我是 mvvm 概念的初学者。所以我尝试了一个示例应用程序。它包含两个文本框,分别是名称和 id、一个提交按钮、一个标签。当我单击提交按钮时,它结合了文本框中的两个字符串并显示在标签中。

我可以提交值,并且在 viewmodel 中属性包含结果。但它没有显示在 view.why..?

在视图中包含

<grid>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding name}"  Height="23"  Margin="9" Name="txtname"  Width="120" />
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding id}" Height="23"  Margin="9" Name="txtid"  Width="120" />
<Button Command="{Binding submit}" Content="submit" Grid.Column="2" Grid.Row="2" Height="23"   Name="btnsubmit"  Width="75" />
<Label Content="{Binding display}" Grid.Row="3" Height="38" HorizontalAlignment="Left"  Name="lbldisplay"  Width="192" />

</grid>

view.cs 代码是

public MainWindow()
    {
        InitializeComponent();
        DataContext = new DemoViewModel();
    }

在我的视图模型中包含两个 .cs 文件

一个是 DemoViewModelInotify.cs。在此我为 inotifypropertychanged 编写代码。另一个是 DemoViewModel.cs.this 包含属性和命令。

namespace mvvmdemonixon.ViewModel
{
public  class DemoViewModel :DemoViewModelInotify
{
  public ICommand submit { get; set; }

  public string name { get; set; }
  public string display { get; set; }
  public int id{get;set;}
  public DemoModel model { get; set; }
  public DemoViewModel()
  {

      submit = new DelegateCommand<object>(this.add);

  }

  public void add(object paramter)
  {
    string a=  mvvmdemonixon.Model.DemoModel.addstring(name, id);
    display = a;
  }

}
}

我的模型包含

namespace mvvmdemonixon.Model
{
public  class DemoModel
{
   public static string addstring(string name1, int no1)
   {
       string display = "The Student Name Is " + name1 + "and Id Is" + no1 + ".";
       return display;
   }

}
}

在我的 app.xaml.cs

private void OnStartup(object sender, StartupEventArgs e)
    {
        mvvmdemonixon.MainWindow view = new MainWindow();
        view.DataContext = new mvvmdemonixon.ViewModel.DemoViewModel();
        view.Show();
    }

在我的应用程序 xaml

<Application x:Class="mvvmdemonixon.App"
Startup="OnStartup">
</Application>

提前谢谢..

4

3 回答 3

2

WPF 绑定引擎使用INotifyPropertyChanged(用于标量属性)和INotifyCollectionChanged(用于集合属性)接口来反映已在绑定数据源(视图模型)中进行的更改。

这个:

public string display { get; set; }

意味着,任何属性设置都不会通知视图,因为 setter 的代码不包含任何通知。代码应该是这样的:

public string display 
{ 
    get { return _display; }
    set
    {
        if (_display != value)
        {
            _display = value;
            OnPropertyChanged("display");
        }
    } 
}
private string _display;

在哪里OnPropertyChanged引发INotifyPropertyChanged.PropertyChanged事件。

这适用于视图模型中的其他视图绑定属性,它们应该更新视图。

于 2012-10-29T07:36:01.493 回答
0

您需要在 ViewModel 中实现INotifyPropertyChanged。并从每个属性设置器中引发属性更改事件。

于 2012-10-29T07:34:39.257 回答
0

你错过了两件事。第一件事是您的 View 的绑定是 OneTime。第二件事是您 ViewModel 在属性更改时不会通知。

要解决第一个问题,您必须更新 xaml,如下所示。

<Label Content="{Binding display, Mode=OneWay}" Grid.Row="3" Height="38" HorizontalAlignment="Left"  Name="lbldisplay"  Width="192" />

要解决第二个问题,您必须实施INotifyPropertyChanged

于 2012-10-29T07:36:51.520 回答