Как вы привязываете к элементу в словаре? - PullRequest
2 голосов
/ 08 февраля 2012

Я использую элемент управления RadCarousel от Telerik в приложении WPF с C #. RadCarousel похож на GridView в том, что он привязывается к коллекции и показывает каждый элемент в коллекции (поэтому мой вопрос не относится к Telerik или RadCarousel).

Я использую шаблон данных, чтобы указать, как должна отображаться каждая запись.

Если я сделаю это, все будет хорошо:

<DataTemplate>
    <TextBlock Text="{Binding Path=oMySubObject.TheAmount}" />
</DataTemplate>

Но что, если мне нужно указать на элемент в словаре?

<DataTemplate>
    <TextBlock Text="{Binding Path=myDictionaryOfSubObjects[TheCurrentIndex].TheAmount}" />
</DataTemplate>

Это я не могу работать и не знаю как. В основном ... мне нужно, чтобы индекс указывался во время выполнения, а когда он обновляется, привязка обновляется.

Любой совет?

Ответы [ 4 ]

1 голос
/ 08 февраля 2012
<Window.Resources>
  <NAMESPACEWHERECONVERTERRESIDES:DictionaryConverter x:Key="cDictionaryConverter"/>
</WindowResources>


    <TextBlock Text="{Binding Path=myDictionaryOfSubObjects, Converter={StaticResource cDictionaryConverter}}"/>

// Примерно так:

[ValueConversion(typeof(Dictionary), typeof(string))]
public class DictionaryConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
         Dictionary<type, type> dict = value as Dictionary<type, type>; 
         return dict[CurrentIndex].TheAmount; 
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return 0;
    }
}
1 голос
/ 08 февраля 2012

В индексаторе можно использовать только постоянные значения, TheCurrentIndex не будет разрешено. Есть несколько обходных путей, например, передача словаря и индекса в многозначный преобразователь для разрешения этого элемента.

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

Window1.xaml

<Window x:Class="QuizBee.Host.Window1"
        x:Name="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ListView ItemsSource="{Binding ElementName=Window1, Path=myDictionary}" />
</Window>

Window1.xaml.cs

public partial class Window1:Window
{
    // the property must be public, and it must have a getter & setter
    public Dictionary<string, myClass> myDictionary { get; set; }

    public Window1()
    {
        // define the dictionary items in the constructor
        // do the defining BEFORE the InitializeComponent();

        myDictionary = new Dictionary<string, myClass>()
        {
            {"item 1", new myClass(1)},
            {"item 2", new myClass(2)},
            {"item 3", new myClass(3)},
            {"item 4", new myClass(4)},
            {"item 5", new myClass(5)},
        }; 

        InitializeComponent();
    }
}
0 голосов
/ 08 февраля 2012

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

Что такое "TheCurrentIndex"?

...