我有一个绑定到 XDocument 的 ComboBox 并且它不会写回值更改:
团队.xml
<?xml version="1.0" encoding="utf-8" ?>
<teams>
<team>
<name>Team A</name>
<leader>C</leader>
<members>
<member>A</member>
<member>B</member>
<member>C</member>
</members>
</team>
<team>
<name>Team B</name>
<leader>B</leader>
<members>
<member>B</member>
<member>D</member>
<member>E</member>
</members>
</team>
</teams>
主窗口.xaml
<Window x:Class="Teamleader.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<DataGrid Name="grid" ItemsSource="{Binding}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Team" Binding="{Binding Path=Element[name].Value}"></DataGridTextColumn>
<DataGridTemplateColumn Header="Leader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=Element[members].Descendants, PresentationTraceSources.TraceLevel=High}"
SelectedValue="{Binding Path=Element[leader].Value, PresentationTraceSources.TraceLevel=High, Mode=TwoWay}"
SelectedValuePath="Value"
DisplayMemberPath="Value"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Leader Text (only for testing)" Binding="{Binding Path=Element[leader].Value, Mode=TwoWay}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button Content="Save" HorizontalAlignment="Right" VerticalAlignment="Bottom" Click="SaveButton_Click" />
</Grid>
</Window>
主窗口.xaml.cs
namespace Teamleader
{
public partial class MainWindow : Window
{
private XDocument doc;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
doc = XDocument.Load("teams.xml");
var teams = from team in doc.Root.Descendants("team") select team;
grid.DataContext = teams.ToList();
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
doc.Save("teams-output.xml");
}
}
}
当我通过单击更改 ComboBox 的 SelectedItem 时,我的 OutputWindow 显示以下四行:
System.Windows.Data 信息:41:BindingExpression 路径错误:找不到“对象”的“值”属性,因为数据项为空。这可能是因为数据提供者尚未生成任何数据。绑定表达式:路径=值;数据项=空;目标元素是 'ComboBox' (Name=''); 目标属性是“NoTarget”(类型“对象”)
System.Windows.Data 信息:20:由于缺少信息,BindingExpression 无法检索值。绑定表达式:路径=值;数据项=空;目标元素是 'ComboBox' (Name=''); 目标属性是“NoTarget”(类型“对象”)
System.Windows.Data 信息:21:BindingExpression 无法从空数据项中检索值。当绑定被分离或绑定到没有值的 Nullable 类型时,可能会发生这种情况。绑定表达式:路径=值;数据项=空;目标元素是 'ComboBox' (Name=''); 目标属性是“NoTarget”(类型“对象”)
System.Windows.Data 信息:10:无法使用绑定检索值,并且不存在有效的备用值;改用默认值。绑定表达式:路径=值;数据项=空;目标元素是 'ComboBox' (Name=''); 目标属性是“NoTarget”(类型“对象”)
当我更改 ComboBox 的 SelectedItem 时,相应的 TextBox 不会更改其值。当我更改 TextBox 中的值时,ComboBox 会立即适应(假设该值在列表中)。此外,使用 TextBox 更改的值会被写回 XDocument。使用 ComboBox 更改值无效。
我的目标框架是 .NET Framework 4.5,我的系统运行的是 Windows7 x64。
我发现ComboBox 与 XElement 双向绑定,但提到的修补程序适用于 .NET 4.0 - 我想现在应该修复它。安装修补程序在我的系统上不起作用。
我还发现ComboBox.SelectedValue 没有从绑定源更新。使用 SelectedItem 而不是 SelectedValueSystem.InvalidOperationException
告诉我,TwoWay 或 OneWayToSource 绑定无法在只读属性“Item”(类型 MS.Internal.Xml.Linq.ComponentModel.XDeferredSingleton)上工作。
谁能指出我的错误或告诉我 .NET Framework 3.5 中的错误是否仍然存在?