gpt4 book ai didi

wpf - 使用 LINQ XML 绑定(bind)组合框

转载 作者:数据小太阳 更新时间:2023-10-29 02:09:40 27 4
gpt4 key购买 nike

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

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

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

我将一个 XElement 传递给绑定(bind)其内容的控件,但我有一个但在 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://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>

我的问题是:

  • 当控件加载时,没问题,但是如果我在元素之间切换左列表框,组合框的值改变......尝试很多事情,做很多事情测试,但不可能修复它!

  • 不可能输入值的人不是在列表中,但我想要能够做到。同样,我做了很多测试了,还是解决不了问题

  • 最后但并非最不重要的一点:我想升职ObservableCollection 时的事件更改为写入 XML 文件,但不可能 catch 一个事件......我试过类似的东西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,我的错误是我专注于可观察集合!

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

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

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

瞧瞧!

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

关于wpf - 使用 LINQ XML 绑定(bind)组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2343164/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com