2012-03-11 21 views
0

我想从用户选择combox元素的同一个XML文件中获取文本框中的XML元素。从组合框项目中获取XML元素

我使用WPF,我能够用下面的代码

<ComboBox Grid.Column="1" Height="21" HorizontalAlignment="Left" Margin="0,32,0,0" Name="QueryChooser" VerticalAlignment="Top" Width="189" ItemsSource="{Binding}" SelectionChanged="QueryChooser_SelectionChanged" /> 

我xaml.cs

private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      Queryslistload(); 
     } 

     private void Queryslistload() 
     { 
      var xElem = XElement.Load(@"Querys.xml"); 

      var querys = from query in xElem.Descendants("QueryLay") 
         orderby query.Element("QueryName").Value 
         select query.Element("QueryName").Value; 
      QueryChooser.ItemsSource = querys; 

     } 

这是我的xml文件来填充从XML文件中的元素组合框本身

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<Querys> 
    <QueryLay> 
    <QueryID> 
     1 
    </QueryID> 
    <QueryName>Check Logspace</QueryName> 
    <Query>dbcc sqlperf(logspace)</Query> 
    </QueryLay> 
    <QueryLay> 
    <QueryID> 
     2 
    </QueryID> 
    <QueryName>Check Spaceused</QueryName> 
    <Query>sp_spaceused</Query> 
    </QueryLay> 

    </Querys> 

所以现在如果用户从组合框中选择检查日志空间我希望查询元素要显示在文本框中

我该如何实现这一目标?

修订

public class Query 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public string Value { get; set; } 
     } 
     private void QueryChooser_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      var xElem = XElement.Load(@"Querys.xml"); 
      var querys = xElem.Descendants("QueryLay").Select(e => 
       new Query{ 
         Id = Convert.ToInt32(e.Element("QueryID").Value), 
     Name = e.Element("QueryName").Value, 
     Value = e.Element("Query").Value 
         }).OrderBy(q=>q.Name) 
         select query.Element("QueryName").Value ; 

      listBox1.ItemsSource = querys; 
     } 

回答

1

而不是直接绑定的ComboBoxXElement的从你的查询返回的,你应该创建自己的类型的代表QueryName /查询组合,然后定义一个LINQ-它将元素投影到这种类型的序列中。

然后,您可以将ComboBoxSelectedItem绑定到数据上下文中的属性。

E.g:

查询类型

public class Query 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

数据上下文

var xElem = XElement.Load(@"Querys.xml"); 

this.Queries = xElem.Descendants("QueryLay").Select(e => 
    new Query 
    { 
     Id = Convert.ToInt32(e.Element("QueryID").Value), 
     Name = e.Element("QueryName").Value, 
     Value = e.Element("Query").Value 
    }).OrderBy(q => q.Name); 

public Query SelectedQuery { get; set; } 

查看

<ComboBox ItemsSource="{Binding Queries}" 
    SelectedItem="{Binding SelectedQuery}" 
    DisplayMemberPath="Name" 
    ... /> 

this.SelectedQuery.Value将在您的数据上下文中为您提供选定的查询值。

+0

我做了相应的修改,出现了一些错误,这是你的意思? (请参阅在问题末尾更新的原始问题 – JackyBoi 2012-03-11 15:32:41

+0

不,对不起,读取XML的查询应该只在初始化时发生一次,以便代码不应该进入选择更改的处理程序。此外,您不需要在查询结尾处选择query.Element(“QueryName”)。Value; – devdigital 2012-03-11 15:35:05

+0

我对你的Datacontext代码进入到什么地方感到有点困惑?是否是querylistload方法? – JackyBoi 2012-03-11 15:38:31