我有一个Listbox,它的项目有多个datatemplate。使用转换器选择datatemplate并解释ListBox的对象集合。
转换器内部我试图将一个属性从datacontext(在lisbox之外)绑定到datatemplate的TextBox控件。
列表框:
<telerik:RadListBox
x:Name="listBox2"
ItemsSource="{Binding MyCollection, Mode=TwoWay}"
VerticalAlignment="Top" Height="400">
<telerik:RadListBox.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplate="{Binding Converter={StaticResource myTestConverter}, ConverterParameter={StaticResource myViewModel}}" />
</DataTemplate>
</telerik:RadListBox.ItemTemplate>
</telerik:RadListBox>
DataTemplate:
<DataTemplate x:Key="TestResource1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding propertyLabel}"
FontStyle="Italic" Width="120" />
<TextBox x:Name="valueField"
FontSize="12" Width="50"
FontWeight="Bold" />
</StackPanel>
</DataTemplate>
转换器内部的转换方法:
_dt = Application.Current.Resources["TestResource1"] as DataTemplate;
var context = _dt.LoadContent();
var ctrl = FindControlByType<TextBox>(context, "valueField");
Binding binding = new Binding("DataContext.Value1");
binding.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor) { AncestorType = typeof(MainPage) };
TextBox txtBox = ctrl as TextBox;
BindingOperations.SetBinding(txtBox, TextBox.TextProperty, binding);
这样做不行。知道我做错了吗?
谢谢。
答案 0 :(得分:1)
LoadContent不适合你的原因是因为在OnApplyTemplate()期间控件本身通常会调用它。
在这种情况下,我发现使用XamlReader.Load()加载自定义DataTemplate然后将其分配给控件更容易。