Silverlight在转换器中设置属性路径?

时间:2012-03-04 16:48:16

标签: silverlight xaml mvvm silverlight-5.0

我有一个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);

这样做不行。知道我做错了吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

LoadContent不适合你的原因是因为在OnApplyTemplate()期间控件本身通常会调用它。

在这种情况下,我发现使用XamlReader.Load()加载自定义DataTemplate然后将其分配给控件更容易。