0

我有一个绑定到 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 中的错误是否仍然存在?

4

2 回答 2

1

UpdateSourceTrigger=PropertyChanged仅适用于 .NET < 4.5 和 KB2328886 或 .NET 4.5 及更高版本的修补程序。要在没有修补程序的情况下使用旧框架修复它,请尝试手动触发所需事件:

<ComboBox ItemsSource="{Binding Path=Element[ActionOptions].Descendants}"
            SelectedValue="{Binding Path=Element[CurrentActionOption].Value, Mode=TwoWay}"
            SelectedValuePath="Value"
            SelectionChanged="SelectedIndexChanged"
            DisplayMemberPath="Value"
            Visibility="{Binding Path=Element[ActionOptionsVisibility].Value}"/>
private void SelectedIndexChanged(object sender, RoutedEventArgs e)
{
    var bindingExpression = ((ComboBox)sender).GetBindingExpression(ComboBox.SelectedValueProperty);
    bindingExpression.UpdateSource();
}
于 2013-05-03T08:59:26.587 回答
1

WPF ComboBox not updates source这个问题确实告诉了我该怎么做。添加UpdateSourceTrigger=PropertyChanged到我的 SelectedValue 绑定中就可以了:

<ComboBox ItemsSource="{Binding Path=Element[members].Descendants}"
          SelectedValue="{Binding Path=Element[leader].Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
          SelectedValuePath="Value"
          DisplayMemberPath="Value"/>

我不知道为什么,但它就像一个魅力。

感谢“相关”侧边栏!

于 2013-05-03T07:04:19.593 回答