WPF - доступ к родительскому элементу управления из шаблона элемента управления стиля Setter - PullRequest
2 голосов
/ 14 декабря 2010

Когда элементы управления не подлежат изменению, мы отображаем их как TextBox, чтобы сохранить согласованный стиль.Проблема в том, что ComboBox может иметь данные любого типа, поэтому привязка свойства Text к 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, чтобы его можно было обработать с помощью кода Converter.Есть ли еще способ сделать это?

Любые другие предложения приветствуются!

1 Ответ

2 голосов
/ 14 декабря 2010

вам нужно использовать свойства SelectedValue и SelectedValuePath:

<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 значение true для ComboBox, оно превращается в TextBox с выбранным значением в качестве его текста.

...