几天前我开始学习 WPF,并且一直在创建一些测试项目来评估我在学习这些材料时对它们的理解。根据这篇文章,“一个属性只有在它是一个依赖属性时才能被绑定。” 为了测试这一点,我使用了两种不同的模式:
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; }
}
}
最后在我的 mainView
中,我将 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>
这很好用,当我运行我Inception (Default)
在文本框中看到的应用程序时,即使Model
or中的所有属性都不ViewModel
是DependencyProperties
. 现在第二次尝试是:
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>
但这没有用。当我运行应用程序时,文本框是空白的。所以我将属性更改为依赖属性,奇怪的是,它起作用了。所以我不明白为什么 Model 和 ViewModel 上的属性可以是常规属性,但代码隐藏属性必须是依赖属性才能绑定?是因为 ViewModel 设置为视图的 DataContext 并且解析器足够聪明,可以实现这一点,还是还有其他原因?
还有一个不太相关的问题:我注意到几乎每一篇关于 WPF 的文章都使用局部变量,然后为它定义一个 getter 和 setter,尽管我们都知道在 .NET 2.5(我相信?)及更高版本中,我们可以只使用get; set;
语法而不必定义局部成员变量。那么这有什么具体原因吗?
提前致谢。