你如何绑定到字典中的项目?

时间:2012-02-07 21:58:31

标签: wpf xaml data-binding dictionary datatemplate

我在使用C#的WPF应用程序中使用Telerik的RadCarousel控件。 RadCarousel类似于GridView,因为它绑定到一个集合并显示集合中的每个项目(所以我的问题不是特定于Telerik或RadCarousel)。

我正在使用DataTemplate来指定每条记录的显示方式。

如果我这样做,它的工作正常:

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

但是如果我需要指向字典中的某个项目呢?

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

这我无法工作,也不知道如何。基本上......我需要在运行时指定索引,当它更新时,绑定更新。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您只能在索引器中使用常量值,TheCurrentIndex将无法解析。有一些解决方法,比如将字典和索引传递给multi value converter来解析那里的项目。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果有任何复杂的事情,你应该做一个能完成这项工作的吸气剂,然后再绑定它。

什么是“TheCurrentIndex”?

答案 3 :(得分:0)

<强> 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();
    }
}