【问题标题】:Data binding access in xaml vs in code behind - Linq to XML?xaml 中的数据绑定访问与后面的代码中的数据绑定访问-Linq to XML?
【发布时间】:2012-02-25 20:43:16
【问题描述】:

我有一个列表框,它绑定并显示 XML 文件中的 Name 元素。选择列表框项目时,我想在文本块中显示与该项目关联的价格值。如何以编程方式检索价格(不是在 xaml 文件中,而是在后面的代码中)?谢谢。

XML 文件有这些节点:

<Product>
    <Name>Book</Name>
    <Price>7</Price>
</Product>

我使用 Linq 并使用 匿名类型 执行 select。如果以编程方式访问该字段的最简单方法是通过命名类型,请告诉我如何。

这是我在 xaml 中绑定的方式(对包含的每个列表框项使用数据模板):

 <TextBlock Text = "{Binding Name}" />

这是我要检索价格的代码隐藏函数:

        private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    { 
       // how do I get the value of Price of the selected item here?
    }

请注意,我想在此函数中访问价格,而不是在 xaml 中!

【问题讨论】:

  • 这取决于您的绑定方式。您是通过 XMLDataProvider 还是手动检索 XMLNodes?你能展示你的代码吗?
  • @SvenG 我刚刚添加了在 xaml 中完成的 Name 绑定。我使用 Linq 读取 xml 文件,所以我不直接使用任何 XMLDataProvider。
  • 能否请您显示该 TextBlock 周围的 ViewModel 和 XAML?

标签: wpf xml linq data-binding listbox


【解决方案1】:

您应该能够从 SelectionChangedEventArgs 参数中检索所选项目。即

var item = e.AddedItems.First();

【讨论】:

  • 我想检索与所选项目关联的价格元素。不是所选项目。
  • @user776676:所以你不能从一个元素中获取一个子 XML 节点或者什么?
  • 我刚刚在我想做什么的问题中添加了信息。谢谢。
【解决方案2】:

请参阅这篇文章 - bind textblock to current listbox item in pure xaml,您可以使用 XmlDataProvider 在 xaml 和代码隐藏中获取名称。

【讨论】:

  • 据我所知,该代码仅使用 xaml。我想在后面的代码中访问 Price 以便我可以用它做一些计算。
【解决方案3】:

首先,您可能甚至不需要 LINQ,因为您可以使用 XmlDocuments 做很多事情,包括通过 XPath (also in Bindings) 进行选择。

如果你有的话,第二次将匿名类型转换为命名类型是微不足道的

select new { Name = ..., Price = ... }

您只需要一个具有相应属性的类

select new Product { Name = ..., Price = ... }
public class Product
{
     public string Name { get; set; }
     public string Price { get; set; } // Datatype is up to you...
}

第三,您可以使用 dynamic 不使用命名类型。

private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ 
   var listBox = (ListBox)sender;
   // Named type:
   Product item = (Product)listBox.SelectedItem;
   // Anonymous type:
   dynamic item = listBox.SelectedItem;
   // <Do something with item.Price, may need to cast it when using dynamic>
   // e.g. MessageBox.Show((string)item.Price);
}

【讨论】:

  • 你真是太棒了。非常感谢!不过,我需要等待 15 小时才能点击“奖励赏金”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多