使用 LINQ XML 绑定组合框

2024-04-28

请原谅我的英语不好,那不是我的母语。

我是 WPF 和 LINQ 的初学者(从 3 天开始),也是 C# 的临时用户。

昨天,我一整天都在尝试解决我的问题并阅读了一些文档,但我的代码中的错误仍然存​​在。

我将 XElement 传递给绑定其内容的控件,但我在 ComboBox 中有一个 but

这是 XElement 的 XML:

<racine>
    <element nom="Element 1">
      <rubrique nom="Element 1 - rubrique 1">
        <etat valeur="Hors service">
          <option valeur="En service" />
          <option valeur="Hors service service" />
        </etat>
        <observation>lorem ipsum</observation>
      </rubrique>
      <rubrique nom="Element 1 - rubrique 2">
        <etat>
        </etat>
        <observation>titi toto</observation>
      </rubrique>
    </element>
    <element nom="Element 2">
      <rubrique nom="Element 2 - rubrique 1">
        <etat valeur="foo">
        </etat>
        <observation>youpi</observation>
      </rubrique>
      <rubrique nom="Element 2 - rubrique 2">
        <etat valeur="bar">
          <option valeur="En service" />
        </etat>
        <observation></observation>
      </rubrique>
    </element>
</racine>

这是我的控件 MonControle.xaml.cs 背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace MonProjet.Controles
{
    /// <summary>
    /// Logique d'interaction pour MonControle.xaml
    /// </summary>
    public partial class MonControle : UserControl
    {
        XElement xRacine;

        ObservableCollection<XElement> xElementsObservable = new ObservableCollection<XElement>();

        public MonControle()
        {
            InitializeComponent();
            DataContext = xElementsObservable;
        }

        #region Propriété Attribus
        [Category("Configuration"), Browsable(false), Description("Element XML racine")]
        public XElement xRacine
        {
            get
            {
                return xRacine;
            }
            set
            {
                this.xRacine = value;
                MajXElementsObservable();

            }
        }
        #endregion

        private void MajXElementsObservable()
        {
            var requette = from xElements in xRacine.Descendants("element")
                           select (XElement)xElements;
            xElementsObservable.Clear();
            foreach (XElement xElement in requette)
            {
                xElementsObservable.Add(xElement);
            }
        }

    }
}

这是 MonControle.xaml 的 xaml :

<UserControl x:Class="MonProjet.Controles.MonControle"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <!--
    http://www.youdev.net/post/2008/09/23/WPF-SplitContainer-2.aspx
    http://www.youdev.net/post/2009/03/19/WPF-SplitContainer-Part-2.aspx
    -->
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25*"/>
            <ColumnDefinition Width="Auto" MinWidth="4"/>
            <ColumnDefinition Width="75*"/>
        </Grid.ColumnDefinitions>
        <DockPanel Grid.Column="0" LastChildFill="True">
            <ListBox Name="lbxElements" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Attribute[nom].Value" />
        </DockPanel>
        <GridSplitter Grid.Column="1" ResizeBehavior="PreviousAndNext" Width="4" VerticalAlignment="Stretch"/>
        <DockPanel Grid.Column="2" LastChildFill="True" DataContext="{Binding Path=SelectedItem.Elements[rubrique], ElementName=lbxElements, UpdateSourceTrigger=PropertyChanged}">
            <ListBox ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}"
                     IsSynchronizedWithCurrentItem="True">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <GroupBox Header="{Binding Path=Attribute[nom].Value}">
                            <StackPanel Orientation="Horizontal">
                                <!-- http://stackoverflow.com/questions/561166/binding-wpf-combobox-to-a-custom-list -->
                                <ComboBox MinWidth="75" IsEditable="True"
                                          ItemsSource="{Binding Path=Element[etat].Elements[option], UpdateSourceTrigger=PropertyChanged}"
                                          DisplayMemberPath="Attribute[valeur].Value"
                                          SelectedValuePath="Attribute[valeur].Value" 
                                          SelectedValue="{Binding Path=Element[etat].Element[option].Attribute[valeur].Value}"
                                          />
                                <TextBox MinWidth="150" AcceptsReturn="False" AcceptsTab="False" TextWrapping="NoWrap"
                                         Text="{Binding Path=Element[observation].Value, UpdateSourceTrigger=PropertyChanged}" />
                            </StackPanel>
                        </GroupBox>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </DockPanel>
    </Grid>
</UserControl>

我的问题是:

  • 当控件加载时,没问题,但是 如果我在元素之间切换 左ListBox,ComboBox的值 改变...尝试很多事情,做很多事情 测试过,但无法修复!

  • 无法输入非此值的人 在列表中,但我想要 能够做到。同样,我也做了很多 测试,但无法解决问题

  • 最后但并非最不重要的一点是:我想升职 ObservableCollection 时发生的事件 更改为写入 XML 文件, 但不可能捕捉到事件...... 我尝试过类似的东西 xElementsObservable.CollectionChanged += new NotifyCollectionChangedEventHandler(XElementsObservable_CollectionChanged); 但它不起作用......

预先感谢您的帮助!


这很难,但我已经解决了我所有的问题!

这是解决方案:

第一次,ComboBox XAML 必须如下所示:

<ComboBox MinWidth="75" IsEditable="True"
          IsSynchronizedWithCurrentItem="False"
          ItemsSource="{Binding Path=Element[etat].Elements[option]}"
          DisplayMemberPath="Attribute[valeur].Value"
          Text="{Binding Element[etat].Attribute[valeur].Value, UpdateSourceTrigger=PropertyChanged}"
          />

这回答了问题1和2:当我们关注包含 的节点的属性“valeur”的值时,我们可以编写我们想要的内容,即使我们编写的值不在集合中,并且,问题ComboBox 文本中的节点显示消失了!

对于问题3,我的错误是我专注于可观察的集合!

但是,解决方案很简单,我在包含我在这里操作的所有 XElement 的 XDocument 上附加了一个“Changed”事件!

因此,我将此代码放在软件的主窗口中:

  private void InitPerso()
    {

        xDoc = XDocument.Load(@"C:\fichier.xml");

        xDoc .Changed += new EventHandler<XObjectChangeEventArgs>(XDoc_Changed);

    }

    private void XEdls_Changed(object sender, XObjectChangeEventArgs e)
    {
        xDoc .Save(@"C:\fichier.xml");
    }

瞧!

请原谅我的英语不好,我希望这会有所帮助......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LINQ XML 绑定组合框 的相关文章

随机推荐

  • 覆盖 JSF Primefaces 消息标签

    我可以覆盖默认实现吗
  • scanf 被跳过[重复]

    这个问题在这里已经有答案了 我正在尝试为一个类制作一个简单的 C 程序 其中一个要求是我需要使用scanf printf对于所有输入和输出 我的问题是为什么我的scanf在 main 中的 for 循环被跳过并且程序刚刚终止之后 这是我的代
  • 在 Java 中启用 Kerberos 的详细日志记录

    我有一个基于 Java 的 Web 应用程序 它获取包含用户名和密码的 Web 表单的内容 并使用 Kerberos 对基于 Windows 的域进行身份验证 KDC 地址显然被配置为在每次查找时映射到不同的 IP 地址 这可以通过使用命令
  • PyQT4 signal.connect 是否使对象保持活动状态?

    如果我有一个信号并且向该信号注册了一个对象函数 这会使该对象保持活动状态并停止该对象的垃圾收集吗 E g class Signals signal Qt pyqtSignal def init self QObject init self
  • Scipy ODE 时间步长向后移动

    我在 Stackoverflow 上四处查看 但找不到任何可以回答我的问题的内容 问题设置 我正在尝试使用以下方法求解刚性 ODE 系统scipy integrate ode 我已将代码简化为最小的工作示例 import scipy as
  • Flutter TextField 在选择时更改图标颜色

    目标 改变颜色prefixIcon旁边的TextField当点击TextField TextField decoration InputDecoration prefixIcon Icon Icons lock outline hintTe
  • VBA 中的查找和查找下一个

    我正在研究 Excel 宏 当我从另一个 Excel 工作表获取数据时 我需要什么 代码应该首先检查是否有任何其他行具有相同的 FundName 如果找到 则条件适用 我只是给出要检查 FundId 的 Excel 工作表示例 S No F
  • 在 Tensorflow 中混合前馈层和循环层?

    有人能够在 Tensorflow 中混合前馈层和循环层吗 例如 输入 gt 转换 gt GRU gt 线性 gt 输出 我可以想象一个人可以用前馈层定义自己的单元 并且没有状态 然后可以使用 MultiRNNCell 函数进行堆叠 如下所示
  • 用于显示 IntelliSense 的 Visual Studio 键盘快捷键

    What s the keyboard shortcut for Visual Studio to display the IntelliSense box if one accidentally hits ESC and wants th
  • 使用 querySelector() 获取最后一个 td 元素

    我有一个变量 它是 dom 中的一个节点 我已经设法一路接近我想要的地方 myvar querySelector tblItinPriceSummary tr 给了我这个 tr td Subtotal td td align right 1
  • preg_replace 和中文字符的奇怪问题

    我有这个奇怪的问题 经过 preg replace 后 一些汉字变成了时髦的字符 这是脚本 message strip tags mysql real escape string POST message img
  • Matplotlib和Pandas结合时对fig、ax、plt的理解

    我试图更好地理解在结合 Matplotlib 和 Pandas 进行绘图时 图形 轴和 plt 是如何组合在一起的 所接受的在这里回答 https stackoverflow com questions 29568110 how to us
  • NHibernate 反射优化器 - 它有什么作用?

    我发现每当我禁用 nhibernate 反射优化器时 初始化会话工厂的速度就会大大加快 这对于测试目的非常有用
  • 如何转换存储为两列(开始、结束)的日期范围以创建新行索引并填充值[重复]

    这个问题在这里已经有答案了 我想将存储为两列 开始 结束 值的日期范围转换为仅包含日期和值的两个新列 my data id end start value 1 4421 2014 01 01 2014 01 03 10 2 4421 201
  • 如何在运行时使用NLog获取当前目标文件的路径?

    我使用 NLog 进行下一个配置
  • C: (int)x 和 Floor(x) 之间的区别?

    在C语言中 这两者有什么区别 float myF 5 6 printf i n int myF gives me 5 printf ld n floor myF also 5 什么时候其中一种比另一种更可取 一个很大的区别是负数 如果你改变
  • 如何在 Excel 中创建时间范围图表

    Can anyone help me create graph of time ranges of all elements in Excel My data looks like this 连接时间和断开连接时间数据值采用 24 小时格式
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 无法使用 LISTAGG

    SELECT deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY deptno Error ORA 00923 FROM keywo
  • 使用 LINQ XML 绑定组合框

    请原谅我的英语不好 那不是我的母语 我是 WPF 和 LINQ 的初学者 从 3 天开始 也是 C 的临时用户 昨天 我一整天都在尝试解决我的问题并阅读了一些文档 但我的代码中的错误仍然存 在 我将 XElement 传递给绑定其内容的控件