Wpf Кнопка условной привязки к переменной - PullRequest
3 голосов
/ 24 апреля 2019

Я новичок в WPF и сталкиваюсь с проблемой, которую не совсем понимаю, как ее решить. Буду признателен, если кто-нибудь поможет мне найти лучший способ решить эту проблему.

  • У меня есть переменная, которую я получаю от ПЛК, значения этой переменной могут быть 0, 1, 2 и 3.

  • У меня есть 4 кнопки-переключателя, которые должны быть привязаны к той же самой переменной.

  • Когда значение переменной равно 0, первая кнопка должна быть проверена, а остальные не отмечены.
  • Когда значение переменной равно 1, следует проверить вторую кнопку и т. Д.

Эта привязка должна быть двусторонней, поэтому, если я нажму одну из кнопок, значение переменной изменится.

У меня есть 3 основных ограничения:

  1. Я ищу решение только для XAML. Мне интересно, можно ли это сделать только на XAML.

  2. Используемая мной кнопка является пользовательской из среды с закрытым исходным кодом.

  3. Я могу привязать кнопку только к имени переменной, которая является строкой, поэтому я не могу, например, установить для нее преобразователь.

Для простоты я написал только соответствующие части кода, так как я не пытаюсь выяснить, почему мой код не работает так сильно, как я ищу лучший подход для решения этой проблемы. Так что в основном некоторые идеи о том, что нужно сделать, чтобы я мог узнать об этом и исправить это сам.

Я уже пробовал 2 решения.

  • Первое решение:

Добавление текстового поля, привязка текстового поля к переменной и попытка связать источник данных с текстовым полем.

Основная проблема этого решения заключается в том, что привязка TwoWay по какой-то причине не работает, свойство флажка кнопок изменяется при изменении значения переменной, но нажатие кнопок ничего не делает.

<TextBox Name="myTextBox" height="0" PlcVarName="varName" /> 
<StackPanel>
        <CustomToggleButton>
            <CustomToggleButton.Style>
                <Style TargetType="{x:Type CustomToggleButton}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=myTextBox, Path=Value, Mode=TwoWay} Value="0">
                            <Setter Property="IsChecked" Value="true"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=myTextBox, Path=Value, Mode=TwoWay} Value="1">
                            <Setter Property="IsChecked" Value="false"/>
                        </DataTrigger>
</DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=myTextBox, Path=Value, Mode=TwoWay} Value="2">
                            <Setter Property="IsChecked" Value="false"/>
                        </DataTrigger>
</DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=myTextBox, Path=Value, Mode=TwoWay} Value="3">
                                <Setter Property="IsChecked" Value="false"/> 
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </CustomToggleButton.Style>
            </CustomToggleButton >

То же самое для других 4 кнопок, но для button2 будет проверено, когда значение равно 1 и т. Д.

Второе решение выглядит следующим образом:

Чтобы дать вам лучшее представление, я могу привязать кнопку к переменной следующим образом:

 <CustomToggleButton PlcVarName="varName">

(лишние свойства для простоты опущены)

Для toggleButton (или кнопки) только из 2 переменных состояния (true / false) это связывание работает отлично, но теперь проблема в том, что моя переменная имеет 4 состояния.

Так что я думал о наличии триггера данных, который привязывается к тому, к чему привязана кнопка. Так что-то вроде этого:

<DataTrigger Binding="{Binding} Value="0">
                            <Setter Property="IsChecked" Value="true"/>
                        </DataTrigger>

Чтобы связать это с собой. или используя:

 "{Binding RelativeSource={RelativeSource Self} 

но оба не работали.

1 Ответ

0 голосов
/ 25 апреля 2019

Мое решение для вас - создать конвертер для преобразования значения 0,1,2,3 в true или false и привязки его к свойству IsCheck в ToggleButton. Конвертер понравился:

public class ConverterToggleButtonCheck : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null)
            return false;
        return ((string)value).Trim() == ((string)parameter).Trim();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null)
            return false;
        if ((bool)value == true)
            return parameter;
        return "";
    }
}

Определить конвертер:

<converter:ConverterToggleButtonCheck x:Key="CallConverterToggleButtonCheck"/>

И используя вот так:

<DockPanel LastChildFill="False">
            <TextBox DockPanel.Dock="Left" x:Name="abc" Width="50" Height="30" Background="White"/>
            <ToggleButton IsChecked="{Binding ElementName=abc, Path=Text, Converter={StaticResource CallConverterToggleButtonCheck}, ConverterParameter='0'}"/>
            <ToggleButton IsChecked="{Binding ElementName=abc, Path=Text, Converter={StaticResource CallConverterToggleButtonCheck}, ConverterParameter='1'}"/>
            <ToggleButton IsChecked="{Binding ElementName=abc, Path=Text, Converter={StaticResource CallConverterToggleButtonCheck}, ConverterParameter='2'}"/>
            <ToggleButton IsChecked="{Binding ElementName=abc, Path=Text, Converter={StaticResource CallConverterToggleButtonCheck}, ConverterParameter='3'}"/>
        </DockPanel>

Лучше всего попробуйте. Я уверен, что это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...