【问题标题】:Getting XML element from a Combobox item从 Combobox 项中获取 XML 元素
【发布时间】:2012-03-12 08:10:48
【问题描述】:

我正在尝试从用户选择的组合框元素中获取文本框中的 XML 元素,也来自同一个 XML 文件。

我正在使用 WPF,我可以使用以下代码使用 xml 文件中的元素填充组合框

 <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 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;
        }

【问题讨论】:

    标签: wpf xml data-binding


    【解决方案1】:

    与其将ComboBox 直接绑定到从查询返回的XElement,不如创建自己的表示QueryName/Query 组合的类型,然后定义一个LINQ-to-XML 查询,将这种类型的序列中的元素。

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

    例如:

    查询类型

    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 在您的数据上下文中将给您选择的查询值。

    【讨论】:

    • 我进行了相应的修改,出现了一些错误,这是您的意思吗? (请参阅问题末尾更新的原始问题
    • 不,抱歉,读取 XML 的查询只应在初始化时发生一次,因此代码不应进入选择更改处理程序。此外,您不需要 select query.Element("QueryName").Value ;在查询结束时。
    • 我对您的 Datacontext 代码进入何处感到有些困惑?是querylistload方法吗?
    • 是的。它显示了用于查询 XML 和生成要绑定的查询集合的代码,以及放置在类上的属性,该属性将存储选定的查询,并且也绑定在组合框中。
    • 请注意,this.Queries 在这种情况下是您的类的另一个属性,它是您的查询集合(例如 IEnumerable
    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2011-06-11
    • 2013-08-24
    • 2016-05-12
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多