Обновление элемента PeropertyChanged внешней модели (библиотека классов) MVVM WPF - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть ObservableCollection из Чат класса библиотеки Telegram ( TDLib ), и я не могу получить доступ, чтобы изменить этот класс и реализовать INotifyPropertyChanged и OnPropertyChanged для peroperies. и у меня есть ListView в моем приложении (C# WPF. NET Core)

ViewModel:

public class ListChatViewModel : BaseViewModel
{
    public ListChatViewModel()
    {
        chats = new ObservableCollection<TdApi.Chat>();
    }

    private ObservableCollection<TdApi.Chat> chats;
    public ObservableCollection<TdApi.Chat> Chats
    {
        get => chats;
        set => SetField(ref chats, value, "Chats");
    }
}

StaticClass:

public class Statics
{
    public static ListChatViewModel ListChatViewModel = new ListChatViewModel();
}

PageListView.xaml:

<ListView x:Name="lv_items" Grid.Row="0" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.ScrollUnit="Pixel" VirtualizingPanel.IsVirtualizingWhenGrouping="True" VirtualizingPanel.CacheLength="50" VirtualizingPanel.CacheLengthUnit="Pixel" ItemContainerStyle="{StaticResource listViewItemMainChatListStyle}" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="lv_items_SelectionChanged">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel><ListView.ItemTemplate>
            <DataTemplate>
                <Grid MinHeight="70" Background="#31394D">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="auto"/>
                    </Grid.ColumnDefinitions>

                    <Border Grid.Column="0" Margin="16,0,0,0" Width="42" Height="42" CornerRadius="42" Background="{Binding Photo, Converter={StaticResource ChatPhotoNullToColorConverter}}"/>
                    <StackPanel Grid.Column="1" Margin="8,0,8,0" VerticalAlignment="Center">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Title}" TextTrimming="CharacterEllipsis" Foreground="#CED4E6" FontSize="14" FontFamily="Roboto"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Opacity="0.7">
                            <TextBlock Text="{Binding LastMessage.Text}" Foreground="#CED4E6" VerticalAlignment="Center" Margin="4,0,0,0" FontFamily="Roboto"/>
                        </StackPanel>
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

PageListView.cs:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        lv_items.ItemsSource = Statics.ListChatViewModel.Chats;
    }

Теперь, как я могу обновить LastMessage из чата? Я использую этот код для обновления LastMessage, но пользовательский интерфейс не обновляется

   var chat = Statics.ListChatViewModel.Chats.FirstOrDefault(a => a.Id == updateChatLastMessage.ChatId);
   chat.LastMessage = updateChatLastMessage.LastMessage;

1 Ответ

0 голосов
/ 06 февраля 2020

Правильный подход здесь состоит в том, чтобы создать модель представления, чтобы обернуть класс Chat (скажем, ChatViewModel), таким образом, вы можете инкапсулировать каждое свойство чата для фактического запуска их события PropertyChanged на множестве.

Таким образом, вы получите что-то вроде этого:

public class ChatViewModel : BaseViewModel
{
    private readonly Chat _chat;

    public ChatViewModel(Chat chat)
    {
        _chat = chat;
    }

    public Message LastMessage
    {
        get => _chat.LastMessage;
        set
        {
            _chat.LastMessage = value;
            PropertyChanged?.Invoke("LastMessage");
        }
    }

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