ControlTemplate中的DataTemplate不更新Binding

时间:2011-11-16 13:50:42

标签: c# wpf xaml binding

我创建了一个带有3个PART_s的控件,一个PART_根据绑定的类型而改变,但是在Control中更改的值不会更新Binding,它似乎可以作为OneWay绑定。

以下是我相信的代码的一部分:

<DataTemplate x:Key="BooleanDAView" DataType="{x:Type sys:Boolean}">
    <CheckBox IsChecked="{Binding ., Mode=TwoWay}"/>
</DataTemplate>
<DataTemplate x:Key="DateTimeDAView" DataType="{x:Type sys:DateTime}">
    <extToolkit:DateTimePicker Value="{Binding ., Mode=TwoWay}"/>
</DataTemplate>
<DataTemplate x:Key="Int32DAView"  DataType="{x:Type sys:Int32}">
    <extToolkit:IntegerUpDown Value="{Binding ., Mode=TwoWay}"/>
</DataTemplate>
<DataTemplate x:Key="StringDAView"  DataType="{x:Type sys:String}">
    <TextBox Text="{Binding ., Mode=TwoWay}"/>
</DataTemplate>

...

<ContentControl x:Name="PART_Content"
        Grid.Row="0" Grid.Column="1"
        Margin="{TemplateBinding Padding}"
        VerticalAlignment="Center"
        VerticalContentAlignment="Center"
        Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
        >
    <ContentControl.ContentTemplateSelector>
        <controls:TypeBasedDataTemplateSelector>
            <controls:TypeBasedDataTemplateSelector.Templates>
                <controls:TypedDictionary>
                    <sys:String x:Key="{x:Type sys:Boolean}">BooleanDAView</sys:String>
                    <sys:String x:Key="{x:Type sys:DateTime}">DateTimeDAView</sys:String>
                    <sys:String x:Key="{x:Type sys:Int32}">Int32DAView</sys:String>
                    <sys:String x:Key="{x:Type sys:String}">StringDAView</sys:String>
                </controls:TypedDictionary>
            </controls:TypeBasedDataTemplateSelector.Templates>
        </controls:TypeBasedDataTemplateSelector>
    </ContentControl.ContentTemplateSelector>
</ContentControl>

对于内容我也试过...... RelativeSource={RelativeSource AncestorType=local:DABaseControl}但没有变化。

如果DataTemplate Binding使用"{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}",则设置后模板不会更改。

或者有更好的方法吗?

由于

2 个答案:

答案 0 :(得分:7)

我刚遇到同样的问题,我想创建一个DataTemplate DataType="{x:Type sys:Boolean}只有一个复选框。但是在路上有很多警告信号告诉我这不是应该做的事情。

首先,{Binding}的简单绑定会抛出异常“双向绑定需要路径或xpath ”,这是第一个警告标志。我将绑定更改为有效的{Binding .}(尽管this MSDN article明确指出它们是等效的)。伏都教帮助的事实是第二个警示标志。然后它正确显示并且检查状态是根据布尔值,但是当单击复选框(即使使用UpdateSourceTrigger=PropertyChanged)时,它拒绝更新绑定源,无论我尝试什么。使用diagnostics:PresentationTraceSources.TraceLevel=High表明它甚至没有尝试绑定(第三个警告标志)。

我继续为bool值创建了一个简单的“框” - 一个名为Value且具有INotifyPropertyChanged实现的bool属性的类。我将绑定更改为{Binding Value},现在一切正常,包括双向绑定。

结论:似乎绑定无法更新绑定对象本身,但只能更新该对象的属性(这就是{Binding}抛出异常的原因,但更明确{Binding .}根据{{​​3}}),1}}抑制了异常。无论如何,创建ViewModel并创建以其为目标的模板的方法似乎不仅仅是一个设计指南,而是一个实际的技术要求。

答案 1 :(得分:0)

我实际上从未与ContentTemplateSelector合作,但如果我不得不冒险猜测我会说它不响应PropertyChanged财产上的ContentControl.Content个事件,或者你的Content绑定不正确。

您可以通过移除ContentTemplateSelector并查看数据是否显示来轻松检查绑定是否正确。如果是这样,您的绑定是正确的。如果没有,则不正确,您需要修复它。

如果问题是ContentTemplateSelector,那么我建议切换到DataTrigger,根据内容确定要使用哪个ContentTemplate。这就是我通常所做的,它使用的转换器只返回typeof(value)

 <Style TargetType="{x:Type ContentControl}">
     <Setter Property="ContentTemplate" Value="{StaticResource StringDAView}" />
     <Style.Triggers>
         <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}" 
                      Value="{x:Type sys:Boolean">
             <Setter Property="ContentTemplate" Value="{StaticResource BooleanDAView}" />
         </DataTrigger>
         <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}" 
                      Value="{x:Type DateTime">
             <Setter Property="ContentTemplate" Value="{StaticResource DateTimeDAView}" />
         </DataTrigger>
         <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}" 
                      Value="{x:Type sys:Int32">
             <Setter Property="ContentTemplate" Value="{StaticResource Int32DAView}" />
         </DataTrigger>
     </Style.Triggers>
 </Style>