Связывание WPF - PullRequest
       21

Связывание WPF

0 голосов
/ 14 мая 2011

Я создаю UserControl в WPF, который я называю YesNoButton.

Он имеет один DependencyProperty, IsChecked и содержит две кнопки ToggleButton с метками «Да» и «Нет».Я связал свойство IsChecked объекта Да ToggleButton с этим свойством IsChecked родительского объекта YesNoButton.Я связал свойство IsChecked Нет ToggleButton со свойством IsChecked Да ToggleButton через 'обратный логический' IValueConverter.Вот моя разметка YesNoButton, за исключением некоторых элементов внешнего вида:

<UserControl ...>
    <StackPanel Orientation="Horizontal">
        <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:YesNoButton}}, Path=IsChecked}">Yes</ToggleButton>
        <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
    </StackPanel>
</UserControl>

В моем приложении я включаю YesNoButton следующим образом:

<local:YesNoButton IsChecked="{Binding Path=BoolPropertyOfDataContext}" />

Когда окно загружается впервые, еслиЯ переключаю BoolPropertyOfDataContext другими средствами, YesNoButton реагирует отлично.

Но как только я нажимаю ToggleButton Да или Нет, хотя визуальное состояние YesNoButton обновляется правильно, привязка к BoolPropertyOfDataContext перестает работать вообще - кажетсябыть отмененнымЯ думал, что эти «связующие цепи» должны были работать нормально, но я явно чего-то здесь упускаю!

Есть идеи?

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Два предложения:

  1. Назовите свой UserControl, чтобы вы могли ссылаться на него
  2. Привязать оба состояния ToggleButton IsChecked к свойству IsChecked для UserControl

Например:

<StackPanel Orientation="Horizontal">
    <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked}">Yes</ToggleButton>
    <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
</StackPanel>
0 голосов
/ 30 мая 2012

Я получил его, применив вместо этого стиль CheckBox:

<CheckBox IsChecked="{Binding Path=BoolPropertyOfDataContext}" Style="{StaticResource YesNoButton}" />

<Style x:Key="YesNoButton" TargetType="{x:Type CheckBox}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">

                <StackPanel Orientation="Horizontal">
                    <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}, Path=IsChecked}">Yes</ToggleButton>
                    <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
                </StackPanel>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...