我是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>
提前谢谢..
答案 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。