Я новичок в WPF и сталкиваюсь с проблемой, которую не совсем понимаю, как ее решить. Буду признателен, если кто-нибудь поможет мне найти лучший способ решить эту проблему.
У меня есть переменная, которую я получаю от ПЛК, значения этой переменной могут быть 0, 1, 2 и 3.
У меня есть 4 кнопки-переключателя, которые должны быть привязаны к той же самой переменной.
- Когда значение переменной равно 0, первая кнопка должна быть проверена, а остальные не отмечены.
- Когда значение переменной равно 1, следует проверить вторую кнопку и т. Д.
Эта привязка должна быть двусторонней, поэтому, если я нажму одну из кнопок, значение переменной изменится.
У меня есть 3 основных ограничения:
Я ищу решение только для XAML. Мне интересно, можно ли это сделать только на XAML.
Используемая мной кнопка является пользовательской из среды с закрытым исходным кодом.
Я могу привязать кнопку только к имени переменной, которая является строкой, поэтому я не могу, например, установить для нее преобразователь.
Для простоты я написал только соответствующие части кода, так как я не пытаюсь выяснить, почему мой код не работает так сильно, как я ищу лучший подход для решения этой проблемы. Так что в основном некоторые идеи о том, что нужно сделать, чтобы я мог узнать об этом и исправить это сам.
Я уже пробовал 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}
но оба не работали.