2012-03-11 66 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