无法使用数据绑定获取任何数据,我有INotify事件,我对xaml对象有绑定,但没有任何显示,如果我将标签上的内容更改为“某些”它可以工作,但没有显示在加载或点击我的按钮
我的Xaml视图
<Grid>
<StackPanel Name="stackpanel">
<Label Content="{Binding Name}" />
<Label Content="{Binding Length}" />
<Label Content="{Binding Rating}" />
<Button Content="Change text" Click="ButtonClick" />
</StackPanel>
</Grid>
其代码隐藏
public partial class Movie
{
readonly MovieViewModel _movieViewModel;
public Movie()
{
InitializeComponent();
_movieViewModel = new MovieViewModel { Movie = { Name = "The Dark Knight", Length = 180, Rating = 88 } };
stackpanel.DataContext = _movieViewModel;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
_movieViewModel.Movie.Name = "bad movie";
}
}
视图模型
class MovieViewModel
{
public MovieViewModel() : this(new Movie())
{
}
public MovieViewModel(Movie movie)
{
Movie = movie;
}
public Movie Movie { get; set; }
}
模特
class Movie : INotifyPropertyChanged
{
public Movie()
{}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
private int _length;
public int Length
{
get { return _length; }
set
{
_length = value;
NotifyPropertyChanged("Length");
}
}
private int _rating;
public int Rating
{
get { return _rating; }
set
{
if (_rating == value) return;
_rating = value;
NotifyPropertyChanged("_Rating");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 0 :(得分:3)
您的绑定设置不正确,这就是没有显示任何内容的原因。
仔细看看你的ViewModel
而不是绑定。您尝试绑定到名为Name
的属性,但您的MovieViewModel
不会公开具有该名称的任何属性。我非常确定会向您报告绑定错误(查看“输出”窗口中的消息)。
要使其正常工作,您需要在ViewModel
中公开属性以匹配您尝试绑定的属性(错误),或者更改xaml
中的绑定以获得正确的路径:
<Label Content="{Binding Movie.Name}" />
<Label Content="{Binding Movie.Length}" />
<Label Content="{Binding Movie.Rating}" />
这应该让你去。
此外 - 如果您计划更改分配给INotifyPropertyChanged
媒体资源的MovieViewModel
对象,您可能还希望在Movie
课程上实施Movie
。只要您只更改已分配给Movie
的{{1}}对象的属性,一切都会正常,但如果您尝试更改分配给此属性的实际对象,则不会生成任何更改通知,并且用户界面将无法正常工作。
此外 - 我注意到你公开了你的MovieViewModel
方法 - 我不会建议这个,因为现在任何人都可以触发此事件。正常的方法是将这些方法设为私有或受保护,这取决于您是否希望提供从继承类触发事件的方法(在NotifyPorpertyChanged
事件的情况下很可能)。
答案 1 :(得分:1)
我认为你有一个打字错误
NotifyPropertyChanged("_Rating");
应该是
NotifyPropertyChanged("Rating");
答案 2 :(得分:0)
我建议您使用Textblock,而不是使用Label。请尝试以下代码
_movieViewModel = new MovieViewModel
{ Movie = { Name = "The Dark Knight", Length = 180, Rating = 88 } };
this.DataContext = _movieViewModel;
和
Textblock如下所示
<StackPanel Name="stackpanel">
<TextBlock Name="textBlock1" Text="{Binding Path=Name}"/>
<TextBlock Name="textBlock2" Text="{Binding Path=Length}"/>
<Button Content="Change text" Click="ButtonClick" />
</StackPanel>