1. 使用类似MVVM的模式
我创建了Movie模型:
public class MovieModel
{
private string _movieTitle;
private string _rating;
public string MovieTitle
{
get { return _movieTitle; }
set { _movieTitle = value; }
}
public string Rating
{
get { return _rating; }
set { _rating = value; }
}
}
和 MovieViewModel
视图模型相关:
public class MovieViewModel
{
MovieModel _movie;
public MovieViewModel()
{
_movie = new MovieModel { MovieTitle = "Inception (Default)" };
}
public MovieModel Movie
{
get { return _movie; }
set { _movie = value; }
}
public string MovieTitle
{
get { return Movie.MovieTitle; }
set { Movie.MovieTitle = value; }
}
}
最后在我的主View
中,我将DataContext设置为MovieViewModel
类的一个实例:
<Window x:Class="MVVMTestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MVVMTestProject.ViewModels"
Name="MainWindowElement"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MovieViewModel/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Vertical">
<TextBox Width="150" Text="{Binding Path=MovieTitle}"></TextBox>
</StackPanel>
</Grid>
当我运行应用程序时,即使Model
或ViewModel
中的属性都不是DependencyProperties
,文本框中会显示Inception(Default)
。这个方法很好用。第二种尝试是:
2. 在MainView
的代码后台中使用属性
在我的主视图的代码后台中,我添加了以下代码:
private string _myText;
public MainWindow()
{
InitializeComponent();
MyText = "Some Text";
}
public string MyText
{
get { return _myText; }
set { set _myText = value; }
}
然后我改变了我的观点:
<Window x:Class="MVVMTestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MVVMTestProject.ViewModels"
Name="MainWindowElement"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MovieViewModel/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Vertical">
<TextBox Width="150" Text="{Binding ElementName=MainWindowElement, Path=MyText}"></TextBox>
</StackPanel>
</Grid>
但是这并没有起作用。当我运行应用程序时,文本框是空的。所以我将属性更改为依赖属性,奇怪的是,它起作用了。所以我不明白为什么模型和视图模型上的属性可以是常规属性,但是代码后台属性必须是依赖属性才能进行绑定?是因为视图模型设置为视图的数据上下文,解析器足够聪明以认识到这一点,还是有其他原因?
另外一个不太相关的问题:我注意到在几乎每篇关于WPF的文章中,人们都使用本地变量,然后为其定义一个getter和setter,尽管我们都知道在.NET 2.5(我相信?)及以上版本中,我们可以只使用
get; set;
语法而不必定义本地成员变量。那么这是有特定的原因吗?提前感谢。