在mvvm中,视图不会更新

时间:2012-10-29 07:30:48

标签: c# wpf mvvm

我是mvvm概念的初学者。所以我尝试了一个示例application.it包含两个textbox是name和id,一个提交按钮,一个label.when我点击提交按钮它结合了文本框中的两个字符串并显示在标签中

我可以提交值,在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();
    }
我的viewmodel中的

包含两个.cs文件

一个是DemoViewModelInotify.cs.in我写了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>

提前谢谢..

3 个答案:

答案 0 :(得分: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事件。

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

答案 1 :(得分:0)

您需要在ViewModel中实施INotifyPropertyChanged。 并从每个属性设置器中提升属性更改事件。

答案 2 :(得分:0)

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

要解决第一个问题,您必须像下面一样更新xaml。

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

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