Привязка данных не работает с ViewModel - PullRequest
0 голосов
/ 27 декабря 2011

Не могу получить какие-либо данные для работы с привязкой данных, у меня есть событие INotify, у меня есть привязка к объектам xaml, но ничего не отображается, если я изменяю содержимое в ярлыках на «что-то», оно работает, но ничего не показываетпри загрузке или при нажатии на мою кнопку

My Xaml view

<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; } 
}

TheМодель

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 ]

3 голосов
/ 27 декабря 2011

У вас неправильно установлены привязки, поэтому ничего не отображается.

Просто присмотритесь к своим 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, уже назначенного MovieViewModel, все будет хорошо, но если вы попытаетесь изменить фактический объект, назначенный этому свойству, уведомления об изменениях не будут генерироваться, и ваш пользовательский интерфейс перестанет работатьправильно.

Более того - я заметил, что вы сделали ваш метод NotifyPorpertyChanged общедоступным - я бы не советовал это делать, поскольку теперь любой может вызвать это событие.Обычный подход состоит в том, чтобы сделать такие методы частными или защищенными, в зависимости от того, хотите ли вы предоставить способ инициировать событие от наследования классов (что весьма вероятно в случае PropertyChanged события).

1 голос
/ 27 декабря 2011

Я думаю, что у вас есть одна ошибка ввода

NotifyPropertyChanged("_Rating");

Должно быть

 NotifyPropertyChanged("Rating");
0 голосов
/ 27 декабря 2011

Вместо того, чтобы использовать Label, я бы посоветовал вам использовать Texblock. Попробуйте следующий код

_movieViewModel = new MovieViewModel 
                      { Movie = { Name = "The Dark Knight", Length = 180, Rating = 88 } };
 this.DataContext = _movieViewModel;

и

Текстовый блок как следующий

<StackPanel Name="stackpanel">
    <TextBlock Name="textBlock1" Text="{Binding Path=Name}"/>
    <TextBlock Name="textBlock2" Text="{Binding Path=Length}"/>
    <Button Content="Change text" Click="ButtonClick" />
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...