C# 通过组合框双向绑定更改数据源中的XML属性
这是我的XAML示例代码:C# 通过组合框双向绑定更改数据源中的XML属性,c#,wpf,xml,data-binding,.net-4.5,C#,Wpf,Xml,Data Binding,.net 4.5,这是我的XAML示例代码: <Grid> <Grid.DataContext> <XmlDataProvider x:Name="DataProvider" Source="datacontext.xml" XPath="/" /> </Grid.DataContext> <ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{
<Grid>
<Grid.DataContext>
<XmlDataProvider x:Name="DataProvider" Source="datacontext.xml" XPath="/" />
</Grid.DataContext>
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods//*}">
<ComboBox.SelectedValue>
<Binding XPath="Contact\ContactMethods/*[@Selected='True']" NotifyOnSourceUpdated="True" NotifyOnTargetUpdated="True" />
</ComboBox.SelectedValue>
</ComboBox>
</Grid>
此方法更改ContactMethod的值,而不是选定属性的值
如果选择Mobile
并单击[submit],结果如下所示:
<ContactMethods>
<ContactMethod Selected="False">Phone</ContactMethod>
<ContactMethod Selected="False">Email</ContactMethod>
<ContactMethod Selected="True">Mobile</ContactMethod>
<ContactMethod Selected="False">Mobile</ContactMethod>
</ContactMethods>
<ContactMethods>
<ContactMethod Selected="False">Phone</ContactMethod>
<ContactMethod Selected="False">Email</ContactMethod>
<ContactMethod Selected="False">Letter</ContactMethod>
<ContactMethod Selected="True">Mobile</ContactMethod>
</ContactMethods>
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods/ContactMethod}"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding XPath=Contact/ContactMethods/@Selected}">
</ComboBox>
问题:
如何更改当前选定项目的选定属性?是否可以保留使用所需xml数据结构所做的更改?为什么不这样做:只需在
ContactMethods
元素中创建一个选定的属性,而不是拥有多个选定的属性:
<Contact ShowsInterest="true">
<Name>John</Name>
<Lastname>Doe</Lastname>
<ContactMethods Selected="Phone">
<ContactMethod>Phone</ContactMethod>
<ContactMethod>Email</ContactMethod>
<ContactMethod>Letter</ContactMethod>
<ContactMethod>Mobile</ContactMethod>
</ContactMethods>
</Contact>
以及您的组合框
定义:
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods/ContactMethod}"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding XPath=Contact/ContactMethods/ContactMethod[@Selected\=\'True\'],Mode=OneTime}">
</ComboBox>
是的,我知道这很容易。不幸的是,我必须使用给定的数据源。我不能影响数据结构。检查我的另一个选择,只是修改了答案。我更喜欢代码隐藏较少的解决方案,因为整个XAML/CodeBehind必须在运行时自动生成。我会等几天,看看是否还有其他方法,如果没有,我会把你的帖子标记为答案。酷,我也会有兴趣听到更多的选择。我想不出别的东西了……也许是第三次装订?第一个绑定用于ItemSource,第二个用于初始化启动时显示的值(一次性或单向绑定),第三个用于更改选定属性。
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods/ContactMethod}"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding XPath=Contact/ContactMethods/@Selected}">
</ComboBox>
private void OnSubmitClick(object sender, RoutedEventArgs e)
{
XElement xe = XElement.Load(new XmlNodeReader(DataProvider.Document));
var elements = xe.Elements("ContactMethods").Elements("ContactMethod").ToList();
var sel = combobox1.SelectedValue;
foreach(XElement element in elements)
{
element.SetAttributeValue("Selected", (string)sel == element.Value ? "True" : "False");
}
xe.Save("datacontext.xml");
//DataProvider.Document.Save("datacontext.xml");
}
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods/ContactMethod}"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding XPath=Contact/ContactMethods/ContactMethod[@Selected\=\'True\'],Mode=OneTime}">
</ComboBox>