Я новичок в 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;
}
}





Да, уведомить надо. Вам необходимо сопоставить данные 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
}
Я не смог этого сделать. Обновление не выполняется. Почему обновляются некоторые части, а не все. Что бы я ни делал, первая привязка не удалась. Например, если я сначала добавляю звук в XAML (снова аудио, видео и аудио), звук не работает. Это всегда первая обязательная часть
вам нужно создать ObservableCollection <XElementViewModel> и привязать к нему в XAML. Затем вы просто добавляете / удаляете элементы в / из этой коллекции, вы не взаимодействуете напрямую с ListBox. Фактически, вы должны удалить Name = "multiMaster" из ListBox; Если вам нужно получить ListBox по имени, вы делаете что-то не так.
каждая XElementViewModel также должна иметь свойство «Elements» типа XElementViewModel, в котором будут храниться подэлементы.
На данный момент у меня нет XElementViewModel, я просто добавляю (удаляю) XElement Node. Вы понимаете, почему это работает для основного узла и аудио, а не для видео? И почему это для первой группы в XAML? Если я поставлю звук перед видео в XAML, он будет работать с видео, а не со звуком. Я постараюсь закодировать то, что вы сказали ..
Я пытаюсь создать XElementViewModel и ObservableCollection <XElementViewModel>, но ничего не работает. Возможно, класс не правильный. Одна трудность состоит в том, что вначале ничего не существует. Я могу создать несколько «Свойств», в каждой может быть несколько аудио и видео ...
Спасибо. Я пытаюсь это сделать. Но как объяснить, что обновляются 2 части из трех? И это, похоже, зависит от позиции в xaml.