Доступ к привязке данных в xaml против кода позади - Linq to XML? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть список, который связывает и отображает элементы Name из файла XML.Когда элемент списка выбран, я хочу отобразить значение цены, связанное с этим элементом, в текстовом блоке.Как получить цену программно (т.е. не в файле 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!

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Во-первых, вам, вероятно, даже не нужен LINQ, поскольку вы можете многое сделать с помощью XmlDocuments, в том числе делать выборку через XPath ( также в 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);
}
0 голосов
/ 03 февраля 2012

См. Этот пост - привязать текстовый блок к текущему элементу списка в чистом xaml , вы можете получить имя как в xaml, так и с выделенным кодом, используя XmlDataProvider.

0 голосов
/ 03 февраля 2012

Вы должны быть в состоянии извлечь выбранный элемент из параметра SelectionChangedEventArgs.т.е.

var item = e.AddedItems.First();
...