WPF - 从Style Setter ControlTemplate中访问父Control

时间:2010-12-14 10:36:07

标签: wpf styles controltemplate setter

当使控件不可修改时,我们将它们显示为TextBox以保持一致的风格。问题是ComboBox可以包含任何类型的数据,因此绑定Text的{​​{1}}属性并不像使用ControlTemplate TextBox那么简单。

SelectedItem

我的想法是使用<Style TargetType="{x:Type ComboBox}"> <Style.Triggers> <Trigger Property="IsReadOnly" Value="True"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <TextBox Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}, Path=????, Converter={StaticResource ResourceKey=ComboToTextConverter}, UpdateSourceTrigger=PropertyChanged}" /> </ControlTemplate> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style> 并发送整个Converter,以便ComboBox代码处理它。反正有吗?

欢迎任何其他建议!

1 个答案:

答案 0 :(得分:2)

您需要使用SelectedValueSelectedValuePath属性:

<Style TargetType="ComboBox" x:Key="cStyle">
<Style.Triggers>
  <Trigger Property="IsReadOnly" Value="True">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ComboBox">
          <TextBox Text="{Binding RelativeSource=
                   {RelativeSource TemplatedParent}, 
                   Path=SelectedValue}" />
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Trigger>
</Style.Triggers>

并继承你的ComboBox

<ComboBox Name="cbox" ItemsSource="{Binding}" 
        Style="{StaticResource cStyle}" 
        SelectedValuePath="SomeText" 
        DisplayMemberPath="SomeText" />

现在,当您在IsReadOnly上将ComboBox属性设置为true时,它会变为TextBox,并将所选值作为其文本。