Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过组合框双向绑定更改数据源中的XML属性_C#_Wpf_Xml_Data Binding_.net 4.5 - Fatal编程技术网

C# 通过组合框双向绑定更改数据源中的XML属性

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="{

这是我的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>
此方法更改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>