数据绑定不能与ViewModel一起使用

时间:2011-12-27 11:01:24

标签: c# xaml data-binding

无法使用数据绑定获取任何数据,我有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));
        }
    }
}

3 个答案:

答案 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>