Привязка данных WPF - не установлен обработчик PropertyChange - PullRequest
0 голосов
/ 30 августа 2018

У меня есть окно WPF, в котором DataContext установлен как объект ViewModel, и который имеет дочерние элементы управления, привязанные к свойствам этого объекта DataContext (ViewModel). Эти элементы управления с привязкой к данным корректно отображают данные из объекта ViewModel. Однако существует StatusBar, содержащий TextBlock, который должен обновляться при изменении свойства привязки базового объекта ViewModel, а TextBlock не обновляется.

Проблема связана с тем, что во время привязки к событию PropertyChanged объекта ViewModel ничего не прикрепляется (или когда он задан как DataContext), и поэтому уведомление об изменениях данных не направляется в TextBlock. управление.

Сокращенный XAML:

Window x:Class="MarketFeedViewer.MainWindow"
        xmlns:marketFeedViewer="clr-namespace:MarketFeedViewer"
        mc:Ignorable="d"
        Title="Market Data Viewer" Height="500" Width="300" >
    <Window.DataContext>
        <marketFeedViewer:MarketDataViewModel />
    </Window.DataContext>

    <Grid Margin="0,0,0,0">
        <WrapPanel  HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="0" Grid.ColumnSpan="2" Margin="0,3,3,0">
            <Label>Host</Label>
            <TextBox x:Name="Host" VerticalContentAlignment="Center" MinWidth="100" Text="{Binding Host}" />

            <Label Content="Port" />
            <TextBox x:Name="Port" MinWidth="50" VerticalContentAlignment="Center"  Text="{Binding Port}"/>
        </WrapPanel>
        <DataGrid x:Name="PricesGrid"  HorizontalAlignment="Center" Margin="5,5,5,5" Grid.Row="1" Grid.ColumnSpan="2"
                  Grid.Column="0"
                  VerticalAlignment="Stretch"

                  ItemsSource="{Binding MarketData}"
                  MinHeight="200" MinWidth="200" VerticalScrollBarVisibility="Auto"/>
 <StatusBar Grid.Row="3" Grid.ColumnSpan="2" Grid.Column="0">
            <StatusBarItem HorizontalAlignment="Right">
                <TextBlock Name="StatusText"  Text="{Binding FeedStatus}" />
            </StatusBarItem>

        </StatusBar>
    </Grid>
</Window>

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

public class MarketDataViewModel : INotifyPropertyChanged
    { 

    public ObservableCollection<WPFL1Data> MarketData { get; set; }

    ...

    public string FeedStatus
    {
        get { return GetStatus(); }
    }
       ...
       ...
    private void ClientOnOnStateChange(object sender, MarketFeedConnectionState e)
    {
        if (App.IsInvokeRequired)
        {
            App.InvokeMethod(() => ClientOnOnStateChange(sender, e));
            return;
        }

        ...
        // here is where Status Bar's TextBlock should be notified
        // that value has changed.
        OnPropertyChanged(FeedStatus);
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        // problem is here: handler ==  null
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

Что такое недостающий фрагмент кода конфигурации XAML?

1 Ответ

0 голосов
/ 30 августа 2018

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

OnPropertyChanged("FeedStatus");

или лучше это:

OnPropertyChanged(nameof(FeedStatus));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...