这是我的XAML示例代码:
<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>
这是我的XML数据源:
<Contact ShowsInterest="true">
<Name>John</Name>
<Lastname>Doe</Lastname>
<ContactMethods>
<ContactMethod Selected="False">Phone</ContactMethod>
<ContactMethod Selected="False">Email</ContactMethod>
<ContactMethod Selected="True">Letter</ContactMethod>
<ContactMethod Selected="False">Mobile</ContactMethod>
</ContactMethods>
</Contact>
上面的代码将联系人方法显示为组合框。将XML Selected Attribute设置为true的ContactMethod在组合框中预选并在启动时显示。
看起来像这样:
我使用以下方法保存数据:
private void OnSubmitClick(object sender, System.EventArgs eventArgs)
{
DataProvider.Document.Save("datacontext.xml");
}
此方法更改ContactMethod的值,而不是Selected Attribute。
如果您选择Mobile
并单击[提交],结果将如下所示:
<ContactMethods>
<ContactMethod Selected="False">Phone</ContactMethod>
<ContactMethod Selected="False">Email</ContactMethod>
<ContactMethod Selected="True">Mobile</ContactMethod>
<ContactMethod Selected="False">Mobile</ContactMethod>
</ContactMethods>
在Selected
属性等于true的情况下,更改将保持不变。控件绑定的值将被覆盖。
所需结果:它应如下所示:
<ContactMethods>
<ContactMethod Selected="False">Phone</ContactMethod>
<ContactMethod Selected="False">Email</ContactMethod>
<ContactMethod Selected="False">Letter</ContactMethod>
<ContactMethod Selected="True">Mobile</ContactMethod>
</ContactMethods>
问题: 如何更改当前所选项目的选定属性?是否可以保留使用所需xml数据结构所做的更改?
答案 0 :(得分:1)
为什么不做这样的事情:只需在ContactMethods
元素中创建一个Selected属性,而不是拥有多个Selected属性:
<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:
<ComboBox Name="combobox1" Width="100" Height="25" ItemsSource="{Binding XPath=Contact/ContactMethods/ContactMethod}"
IsSynchronizedWithCurrentItem="True"
SelectedValue="{Binding XPath=Contact/ContactMethods/@Selected}">
</ComboBox>
另一个不更改源XML结构的选项:
我们的想法是在持久性时将所选属性标志设置为ComboBox
SelectedValue
来改变XML:
将OnSubmitClick
方法更改为:
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
定义为:
<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>