WPF C# MVVM ListView не обновляется - PullRequest
0 голосов
/ 25 апреля 2020

Я вижу похожие вопросы, касающиеся того, что ListView не обновляется в MVVM, однако я уже давно борюсь с этим .. У меня есть 2 класса, один из которых является частью другого, например:


    public class Info
    {

        public string Name { get; set; }

        public string Status { get; set; }

        ....

        public ObservableCollection<Content> UserContent { get; set; } = new ObservableCollection<Content>();
    }

    public class Content
    {
        public string Filename { get; set; }

        public string Path { get; set; }

        public string Type { get; set; }

    }

Страница разделена на 2 столбца, слева - элементы управления, а справа - один пользовательский. При щелчке по элементу управления он передает текст данных в пользовательский элемент управления

<local:ScreenControl DataContext="{Binding MainPageViewModel.SelectedDevice, 
       Source={x:Static local:ViewModelLocator.Instance}}" />

UserControl содержит TabControl. Одна из вкладок отображает детали из класса Info

.....
<TextBlock Style="{StaticResource localTextBlock}" Text="{Binding Name}" />
<TextBlock Style="{StaticResource localTextBlock}" Text="{Binding Location}" />
.....

И до здесь все хорошо. Проблема начинается на другой вкладке. У меня есть кнопка, которая откроет OpenFileDialog, перейдет к видеофайлу и добавит файл в UserContent. Затем должен отобразиться список просмотра.

public ICommand AddVidCommand { get; set; }
AddVidCommand = new RelayCommand(AddVid);
public void AddVid()
        {
            if (MainPageViewModel.SelectedDevice is ScreenInfo info)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Video Files|*.mp4;*.mkv;*.wmv";
                if (openFileDialog.ShowDialog() == true)
                {
                    info.UserContent.Add(new Content
                    {
                        Filename = openFileDialog.SafeFileName,
                        Path = openFileDialog.FileName
                    });
                }
            }
        }

<TabItem Header="Playlist">
    <StackPanel Orientation="Vertical" >
        <Button Content="Add" 
                Command="{Binding ScreenControlViewModel.AddVidCommand, 
                          Source={x:Static local:ViewModelLocator.Instance}}"
                CommandParameter="{Binding}"/>

        <ListView x:Name="fileList"
                   ItemsSource="{Binding UserContent}">

        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Type}" Header="Type" />
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Filename}" Header="Name" />
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding Path}" Header="Path" />
             </GridView>
        </ListView.View>
        </ListView>
    </StackPanel>
</TabItem>

Добавление MainPageViewModel

    public class MainPageViewModel : BaseViewModel
    {
        public static ObservableCollection<ScreenInfo> Devices { get; set; }

        public static ScreenInfo SelectedDevice { get; set; }

        public MainPageViewModel()
        {
            Devices = new ObservableCollection<ScreenInfo>();

        }
    }

Как вы, наверное, догадались, мой список не обновляется. Я ясно вижу информацию, передаваемую классу в visual studio с помощью команды button, но пользовательский интерфейс не отображается ..

1 Ответ

0 голосов
/ 27 апреля 2020

Ответ, предоставленный Клеменсом в комментарии к вопросу:

Вы смешиваете в своем классе stati c и non-stati c участников. Каждый раз, когда создается экземпляр MainPageViewModel, значение свойства stati c Devices заменяется новым ObservableCollection без уведомления потребителей об этом свойстве. Не используйте stati c свойства с MVVM.

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