Привязка списка wpf XElement не обновлена

Я новичок в C# / xaml, и я не понимаю всего в привязке, в том числе, если необходимо уведомить или не обновлять представление.

В моем коде я использую XML и XElement для хранения данных. XML содержит один список элементов (Свойства), каждый из этих элементов содержит два списка (videoStreams и audioStreams).

Когда я добавляю (или удаляю) одно видео, вид не обновляется. После того, как я добавлю (или удалю) одно аудио, будет выполнено обращение к просмотру. Списки видео и аудио обновлены. Если в коде xaml я переворачиваю списки аудио и видео, проблема связана со звуком.

Вы хоть знаете об этой проблеме?

Мой XML (отрывок)

<Root>
<Properties name = "Node">
    <videoNode exclude = "false">
        <rate minFrameRate = "" maxFrameRate = "" />
    </videoNode>
    <audioNode >
        <bitrateRange min = "" max = "" />
    </audioNode>
</Properties>

XAML

    <ListBox Name = "multiMaster" ItemsSource  = "{Binding Elements[Properties]}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <ListBox Name = "videoStreams" ItemsSource = "{Binding Elements[videoNode]}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel x:Name = "stackVideo" Orientation = "Vertical">
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <ListBox Name = "audioStreams" ItemsSource = "{Binding Elements[audioNode]}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel x:Name = "stackAudio" Orientation = "Vertical">
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

и функция добавления

    foreach (XElement childElement in oMMPNode.Descendants("Properties"))
{
    if (childElement.Attribute("id").Value == profileId)
    {
        XElement newVideo = new XElement("videoNode");
        childElement.Add(newVideo);

        break;
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
76
1

Ответы 1

Да, уведомить надо. Вам необходимо сопоставить данные XML с набором ViewModels. Они должны реализовывать INotifyPropertyChanged и вызывать соответствующее событие при изменении значений и т. д.

Итак, вместо XElement вы должны использовать:

public class XElementViewModel:INotifyPropertyChanged
{ 

 public XElementViewModel(XElement data)
 {
    // initialize properties 
 }
 ... 
 // here you define all needed properties of XElement that you want to expose
}

Спасибо. Я пытаюсь это сделать. Но как объяснить, что обновляются 2 части из трех? И это, похоже, зависит от позиции в xaml.

JULIEN 11.07.2018 22:07

Я не смог этого сделать. Обновление не выполняется. Почему обновляются некоторые части, а не все. Что бы я ни делал, первая привязка не удалась. Например, если я сначала добавляю звук в XAML (снова аудио, видео и аудио), звук не работает. Это всегда первая обязательная часть

JULIEN 13.07.2018 12:18

вам нужно создать ObservableCollection <XElementViewModel> и привязать к нему в XAML. Затем вы просто добавляете / удаляете элементы в / из этой коллекции, вы не взаимодействуете напрямую с ListBox. Фактически, вы должны удалить Name = "multiMaster" из ListBox; Если вам нужно получить ListBox по имени, вы делаете что-то не так.

Andy 13.07.2018 13:50

каждая XElementViewModel также должна иметь свойство «Elements» типа XElementViewModel, в котором будут храниться подэлементы.

Andy 13.07.2018 13:55

На данный момент у меня нет XElementViewModel, я просто добавляю (удаляю) XElement Node. Вы понимаете, почему это работает для основного узла и аудио, а не для видео? И почему это для первой группы в XAML? Если я поставлю звук перед видео в XAML, он будет работать с видео, а не со звуком. Я постараюсь закодировать то, что вы сказали ..

JULIEN 13.07.2018 22:40

Я пытаюсь создать XElementViewModel и ObservableCollection <XElementViewModel>, но ничего не работает. Возможно, класс не правильный. Одна трудность состоит в том, что вначале ничего не существует. Я могу создать несколько «Свойств», в каждой может быть несколько аудио и видео ...

JULIEN 15.07.2018 23:27

Другие вопросы по теме