2012-10-29 109 views
0

我是初學者在mvvm concept.so我試過一個示例application.it包含兩個文本框是名稱和id,一個提交按鈕,一個label.when我點擊提交按鈕時,它結合了兩個字符串從文本框中顯示並顯示在標籤中。在mvvm視圖不更新

我可以提交值,並在viewmodel屬性包含result.but它不顯示在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.in這個我寫的代碼for inotifypropertychanged。 另一個是DemoViewModel.cs.這個包含屬性和命令。

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> 

提前感謝..

回答

0

您需要在ViewModel中實現INotifyPropertyChanged。 並從每個屬性設置器中引發屬性更改事件。

+0

嗨@ michael我添加了inotifypropertychanged並使屬性像above.it打onpropertychanged但它沒有更新視圖..爲什麼..? – nichu09

+0

@ nixen09:請確保您使用雙向綁定 - '{Binding Name,Mode = TwoWay}' – MichaelS

2

WPF綁定引擎使用INotifyPropertyChanged(用於標量屬性)和INotifyCollectionChanged(用於集合屬性)接口來反映在綁定數據源(視圖模型)中所做的更改。

此:

public string display { get; set; } 

手段,任何屬性設置將通知看法,因爲二傳的代碼不包含任何通知。該代碼應該是這樣的:

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

其中OnPropertyChanged引發INotifyPropertyChanged.PropertyChanged事件。

對於視圖模型中的其他視圖綁定屬性,它應該更新視圖。

+0

hi @dennis我添加了inotifypropertychanged並且使屬性像above.it一樣,但是它的onPropertychanged卻沒有更新。 。? – nichu09

+0

@ nixen09:請顯示最新的代碼。另外,什麼是'DemoViewModelInotify'? – Dennis

+0

謝謝你的幫助..結果.. – nichu09

0

有兩件事你失蹤了。第一件事是你的視圖的綁定是OneTime。第二件事是ViewModel在屬性改變時不通知。

要解決第一個問題,必須像下面那樣更新xaml。

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

要解決您的第二個問題,您必須實施INotifyPropertyChanged

+0

>第一件事是你的視圖的綁定是一次性:默認情況下,綁定模式在這裏將是兩種方式。 – Dennis

+0

@Dennis這是不正確的。綁定模式的默認值取決於控制類型。 http://msdn.microsoft.com/en-us/library/system.windows.data.binding.mode.aspx – Ekk

+0

你完全正確,我錯過了,綁定控件是'Label'。所以,默認模式將是'OneWay',而不是'OneTime'。仍然沒有必要明確設置「OneWay」。 – Dennis