如何在 WPF 中的 XML 数据绑定列表框中添加/删除项目?

问题描述 投票:0回答:1

我是 WPF 新手,XML 数据绑定让我很困惑,所以如果我不知道我在说什么,请耐心等待。

我正在尝试制作一个具有双向绑定的 XML 绑定列表框。我能够将列表框绑定到 XML 文档并编辑项目。但我很难添加或删除项目。我只是想删除单选的项目,或者通过 UI 提示添加新项目。

XAML:

    <Window.Resources>
        <DataTemplate x:Key="QuickDataTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding XPath=Title}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                <ui:TextBox x:Name="ListTextBox" Grid.Column="1" Text="{Binding XPath=Value}" IsEnabled="False" Foreground="Black" Opacity="100" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.DataContext>
            <XmlDataProvider x:Name="QuickData" Source="QuickData.xml" XPath="List/Item" />
        </Grid.DataContext>

...

                                <ListBox Width="200" Height="140" Name="QuickDataList"                      HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True"
                                         Visibility="Visible" ItemsSource="{Binding}" ItemTemplate="{StaticResource QuickDataTemplate}">
                                </ListBox>
</Grid>

C# 代码背后:

string QuickDataPath = path + "QuickData.xml";
QuickData.Source = new Uri(QuickDataPath);

        private void ListEdit_Click(object sender, RoutedEventArgs e)
        {
            P_EditQuickData.Visibility = Visibility.Visible;
            ListSave.Visibility = Visibility.Visible;
        }
        private void ListDelete_Click(object sender, RoutedEventArgs e)
        {
            QuickDataList.Items.RemoveAt
            (QuickDataList.Items.IndexOf(QuickDataList.SelectedItem));
            ListSave.Visibility = Visibility.Visible;
        }
        private void ListSave_Click(object sender, RoutedEventArgs e)
        {
            ListSave.Visibility = Visibility.Collapsed;
            string source = QuickData.Source.LocalPath;
            QuickData.Document.Save(source);

        }

XML 文档:

<?xml version="1.0" encoding="utf-8"?>
<List xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Item>
    <Title>Holes</Title>
    <Value>29</Value>
  </Item>
  <Item>
    <Title>Holes</Title>
    <Value>28</Value>
  </Item>
  <Item>
    <Title>Holes</Title>
    <Value>14</Value>
  </Item>
</List>

我可以轻松编辑项目,但在尝试通过“QuickDataList.Items.RemoveAt”删除或添加项目时出现此错误:

System.InvalidOperationException:“使用 ItemsSource 时操作无效。使用 ItemsControl.ItemsSource 访问和修改元素。'

我引用了this文章,但我就是无法理解它。

我想我可以反序列化/加载 xml 文档,选择正确的项目,然后删除/添加子项并重新序列化,但是与简单地绑定 xml 相比,这似乎是过多的代码并编辑它。

我非常感谢任何反馈。

c# xml wpf xaml data-binding
1个回答
0
投票

错误告诉您的是,当控件绑定到 ItemsSource 时,您无法修改 Items 集合。您需要直接修改源,在本例中您使用的是 URI,因此您必须修改 Xml 文件并刷新 XmlDataProvider。

或者,您可以将 Xml 文件作为 XmlDocument 加载,并将其绑定到数据提供程序(通过

Document
属性,而不是
Source
)。此方法使 XML 的操作变得更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.