INotifyPropertyChanged реализован, но не работает - PullRequest
0 голосов
/ 04 января 2019

У меня есть приложение, которое использует шаблон MVVM и реализует INotifyPropertyChanged, но оно не работает.Обычно, когда я выбираю Wine из списка и нажимаю «открыть», другой пользовательский контроль должен загружать все заполненные детали.

Я следовал вместе с курсом множественного взгляда и пытался адаптировать его и создать что-то из своегосвоя.Я много часов изучал исходный код курса множественного взгляда и вопросы переполнения стека и просто не вижу, что мне не хватает.Схожу с ума здесь .. :(

После многих поисков я знаю, что моя привязка данных работает, потому что я могу принудительно обновить целевое обновление следующим образом:

txtWijnNaam.GetBindingExpression(TextBox.TextProperty).UpdateTarget();

Я также попытался добавитьINotifyPropertyChanged к моему классу модели Wine, а также к модели представления, но это не сработало, и также не используется таким образом в рабочем исходном коде курса множественного освещения, поэтому не должно быть необходимости.

Модель представленияЯ использую:

class WineDetailViewModel : ViewModelBase
{
    private readonly string _baseUri = "https://localhost/api/wines";
    private IEventAggregator _eventAggregator;

    public WineDetailViewModel()
    {
        _eventAggregator = EventAggregatorSingleton.Instance;
        _eventAggregator.GetEvent<OpenWineDetailViewEvent>().Subscribe(OnOpenWineDetailView);
    }

    private void OnOpenWineDetailView(int wineId)
    {
        _wine = ApiHelper.GetApiResult<Wine>($"{ _baseUri}/{wineId}");
    }

    private Wine _wine;

    public Wine WineFull
    {
        get { return _wine; }
        set
        {
            _wine = value;
            OnPropertyChanged();
        }
    }
}

И базовый класс, от которого он наследует, реализуя интерфейс INotifyPropertyChanged:

class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Часть моего файла Xaml, я попытался установить updateSourceTrigger, как я видел нанекоторые ответы здесь, но это тоже не помогло:

<UserControl x:Class="WineGUI.View.WineDetailView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:WineGUI.View"
         xmlns:ViewModels="clr-namespace:WineGUI.ViewModel"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<UserControl.DataContext>
    <ViewModels:WineDetailViewModel/>
</UserControl.DataContext>
<StackPanel>
    <Grid Margin="5">
        <TextBlock Text="Naam :" VerticalAlignment="Center"/>
        <TextBox Grid.Column="1" Name="txtWijnNaam" Margin="5" Text="{Binding WineFull.Name, Mode=TwoWay}"/>
        <TextBlock Grid.Row="1" Text="Jaar :" VerticalAlignment="Center"/>
        <TextBox Grid.Row="1" Grid.Column="1" Name="txtWijnYear" Margin="5" Text="{Binding WineFull.Year, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBlock Grid.Row="2" Text="Prijs :" VerticalAlignment="Center"/>

Я заметил, что метод OnPropertyChanged () моего свойства WineFull никогда не вызывается, но я не понимаю, почему. У курса pluralsight одинаковый набор(кроме некоторых имен, конечно), и он работает просто отлично.

Любая помощь будет принята с благодарностью. Если мне нужно добавить дополнительную информацию или код, пожалуйста,дайте мне знать.

1 Ответ

0 голосов
/ 04 января 2019

Вы устанавливаете значение поля поддержки, а не свойство, поэтому метод OnPropertyChanged никогда не вызывается.

Вы можете вызвать OnPropertyChanged для свойства WineFull в методе OnOpenWineDetailView:

private void OnOpenWineDetailView(int wineId)
{
    _wine = ApiHelper.GetApiResult<Wine>($"{ _baseUri}/{wineId}");
    OnPropertyChanged(nameof(WineFull));
}

Или вы можете использовать свойство:

private void OnOpenWineDetailView(int wineId)
{
    WineFull= ApiHelper.GetApiResult<Wine>($"{ _baseUri}/{wineId}");
}
...