我在使用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>
这我无法工作,也不知道如何。基本上......我需要在运行时指定索引,当它更新时,绑定更新。
有什么建议吗?
答案 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();
}
}