使用 LINQ XML 绑定 ComboBox

     2023-02-22     242

关键词:

【中文标题】使用 LINQ XML 绑定 ComboBox【英文标题】:Binding ComboBox with LINQ XML 【发布时间】:2011-01-21 12:55:44 【问题描述】:

对不起,我的英语很差,那不是我的母语。

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

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

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

这是 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://***.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>

我的问题是:

控件加载的时候还可以,但是 如果我在元素之间切换 left ListBox,ComboBox的值 改变...尝试很多事情,做很多事情 测试,但不可能修复它!

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

最后但同样重要的是:我想升职 ObservableCollection 时的事件 更改为写入 XML 文件, 但不可能赶上一个事件...... 我试过类似的东西 xElementsObservable.CollectionChanged += 新的 NotifyCollectionChangedEventHandler(XElementsObservable_CollectionChanged); 但它不起作用......

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

这很难,但我有解决我所有问题的方法!

这里是解决方案:

第一时间,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,我的错误是我专注于可观察的集合!

但是,解决方案很简单,我在 XDocument 上附加了一个“已更改”事件,其中包含我在此处操作的所有 XElement!

所以,我把这段代码放在我软件的主窗口中:

  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");
    

等等!

对不起,我的英语不好,我希望这会有所帮助......

【讨论】:

c#combobox绑定枚举方式

建立一个类:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Reflection;usingSystem.ComponentModel;namespaceWindowsFormsApplication1{publicclassEnumDescription{publi 查看详情

wpf中,combobox值显示问题

WPF中,如果一个下拉框ComboBox是通过绑定XML显示的下拉内容,将其选定的项保存到数据库后,使用SqlDataReader.Read的方法取出该值。问题如何将取出来的值再显示到该ComboBox上去,无法将取出来的值赋值给SelectedValue?ComboBox里的数... 查看详情

使用 MVVM 绑定 ComboBox SelectedItem

】使用MVVM绑定ComboBoxSelectedItem【英文标题】:BindingComboBoxSelectedItemusingMVVM【发布时间】:2013-11-0701:49:45【问题描述】:我的ComboBox中的SelectedItem有问题。<ComboBoxName="cbxSalesPeriods"ItemsSource="BindingSalesPeriods"DisplayMemberPath="di 查看详情

数据绑定使用xml数据作为binding的source

原文:数据绑定(六)使用XML数据作为Binding的Source.NETFramework提供了两套处理XML数据的类库1.符合DOM标准的类库:包括XmlDocument、XmlElement、XmlNode、XmlAttribute等类,这套类库的特定是中规中矩、功能强大,但也背负了太多XML的传统和... 查看详情

如何使用绑定设置 Combobox Item isEnabled 属性?

】如何使用绑定设置ComboboxItemisEnabled属性?【英文标题】:HowcanIsetComboboxItemisEnablepropertywithbinding?【发布时间】:2022-01-0312:34:35【问题描述】:我有一个模型视图和一个名为isEnable的属性,我想设置comboboxItemIsEnable属性并绑定到模... 查看详情

使用 MVVM 的 WPF ComboBox 的双向绑定问题

】使用MVVM的WPFComboBox的双向绑定问题【英文标题】:Two-waybindingproblemwithWPFComboBoxusingMVVM【发布时间】:2011-09-0223:35:14【问题描述】:我有一个具有许多属性的Activity对象。其中之一如下:publicActivityStatusStatusgetreturnstatus;setstatus=val... 查看详情

WPF ComboBox 绑定 ItemsSource

】WPFComboBox绑定ItemsSource【英文标题】:WPFComboBoxbindingItemsSource【发布时间】:2015-04-0701:26:27【问题描述】:我是WPF的初学者,正在尝试将ComboBox的项目绑定到ObservableCollection我使用了这个代码:XAML<Windowx:Class="comboBinding2.MainWindow... 查看详情

combobox绑定键值对(代码片段)

以下是ComboBox绑定键值对的C#代码:ArrayListmylist=newArrayList();mylist.Add(newDictionaryEntry("WinFormURL","http://www.cnblogs.com/cate/winform/"));mylist.Add(newDictionaryEntry("ASPNETURL","http://www.cnblogs.com/cate/aspnet/"));mylist.Add(newDictionaryEntry("JihuaURL","http://www.cnbl... 查看详情

将 UWP ComboBox ItemsSource 绑定到 Enum

】将UWPComboBoxItemsSource绑定到Enum【英文标题】:BindUWPComboBoxItemsSourcetoEnum【发布时间】:2017-01-0516:43:32【问题描述】:可以在WPF应用程序中使用ObjectDataProvider将枚举的字符串值绑定到ComboBox的ItemsSource,如thisquestion所示。但是,当... 查看详情

WPF 使用 id 从数据库表中绑定 DataGrid 列 ComboBox

】WPF使用id从数据库表中绑定DataGrid列ComboBox【英文标题】:WPFbindDataGridcolumnComboBoxfromdatabasetableusingid【发布时间】:2019-04-1517:36:37【问题描述】:我有课[Table(Name="Categories")]classCategory[Column(Name="CategoryID",IsPrimaryKey=true,IsDbGener 查看详情

WPF DataTemplate ComboBox 绑定问题

】WPFDataTemplateComboBox绑定问题【英文标题】:WPFDataTemplateComboBoxbindingissue【发布时间】:2011-07-0512:25:33【问题描述】:编辑:重写问题我在我的WPF用户控件中使用来自http://dlhsoft.com/Home.aspx的项目管理库。我在我的页面上显示他们... 查看详情

miniui绑定mini-combobox下拉框

一:最先开始使用json字符串绑定combobox[{"id":1,"value":"是","text":"是"},{"id":0,"value":"否","text":"否"}]然后我忘记json字符串的格式了,id属性没有加"",combobox一直绑定不上数据,而且请注意text属性是combobox的显示值,value属性不是显示... 查看详情

ComboBox:向项目添加文本和值(无绑定源)

】ComboBox:向项目添加文本和值(无绑定源)【英文标题】:ComboBox:AddingTextandValuetoanItem(noBindingSource)【发布时间】:2011-03-0501:09:00【问题描述】:在C#WinApp中,如何将Text和Value同时添加到ComboBox的项目中?我进行了搜索,通常答... 查看详情

使用 Linq (asp.net) 绑定 Gridview 数据源

】使用Linq(asp.net)绑定Gridview数据源【英文标题】:BindGridviewDatasourcewithLinq(asp.net)【发布时间】:2013-09-2212:45:22【问题描述】:基本上,我想做的是将Linq查询绑定到gridview的数据源。到目前为止,这是我的代码:ddgDossiers.DataSource=(... 查看详情

combobox在wpf中的绑定示例:绑定项集合转换,及其源代码

在WPF的Xaml中为ComboBox绑定数据时,由于参数很多,很容易混淆,在ListView中使用更是如此。本文通过对ComboBox在窗口和在ListView中绑定对象的属性和属性可能是枚举类型的情况进行简单讲解和示例,以作实际应用参照。源码可以到... 查看详情

为属性绑定 DependencyProperty 是子样式 ComboBox

】为属性绑定DependencyProperty是子样式ComboBox【英文标题】:BindingDependencyPropertyforpropertyissubstyleComboBox【发布时间】:2021-12-0900:09:25【问题描述】:我有一个继承自ComboBox的CustomComboBox组件,其样式已复制到另一个资源字典xaml文件... 查看详情

winform控件combobox数据绑定

ComboBox下拉菜单控件,在数据库内的ComboBox应用的表进行修改时,如果是用的普通方法,显示数据一个方法,添加数据一个方法这样会导致程序后期维护难度增加,在这里使用数据绑定来让ComboBox数据实现根据数据库对应表数据显示,降低... 查看详情

绑定列表和 LINQ?

...BindingList中的一些数据进行排序。完成Linq查询后,我需要使用BindingList集合来绑定我的数据。varorderedList=//Hereislinqqueryreturn(BindingList<MyObject>)orderedList;这 查看详情