WPF列表框绑定XElement未更新

时间:2018-07-11 09:45:46

标签: c# xaml

我是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;
    }
}

1 个答案:

答案 0 :(得分:0)

是的,有必要通知。您需要将XML数据映射到一组ViewModels。它们应该实现INotifyPropertyChanged,并在值更改时引发相应的事件,等等。

因此,您将使用Xp代替XElement:

public class XElementViewModel:INotifyPropertyChanged
{ 

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