我是 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 相比,这似乎是过多的代码并编辑它。
我非常感谢任何反馈。
错误告诉您的是,当控件绑定到 ItemsSource 时,您无法修改 Items 集合。您需要直接修改源,在本例中您使用的是 URI,因此您必须修改 Xml 文件并刷新 XmlDataProvider。
或者,您可以将 Xml 文件作为 XmlDocument 加载,并将其绑定到数据提供程序(通过
Document
属性,而不是 Source
)。此方法使 XML 的操作变得更加容易。