WPF按钮条件绑定到变量

时间:2019-04-24 19:54:02

标签: c# wpf data-binding

我是WPF的新手,我遇到的问题是我不确定如何解决。如果有人可以引导我找到解决此问题的最佳方法,我将不胜感激。

  • 我有一个从PLC获取的变量,该变量的值可以是0、1、2和3。

  • 我有4个切换按钮,必须将其绑定到同一变量。

  • 当变量的值为0时,应该选中第一个按钮,而取消选中其他按钮。
  • 当变量的值为1时,应检查第二个按钮,依此类推。

此绑定必须是双向绑定,因此,如果我按下其中一个按钮,则变量的值必须更改。

  

我有3个主要限制条件:

     
      
  1. 我正在寻找仅XAML解决方案。我想知道是否可以仅在XAML中完成此操作。

  2.   
  3. 我使用的按钮是来自封闭源框架的自定义按钮。

  4.   
  5. 我只能将按钮绑定到变量的名称,该名称是一个字符串,因此例如,我无法为其设置转换器。

  6.   

为简单起见,我只编写了代码的相关部分,因为我不想弄清楚为什么我的代码不能像我在寻找更好的方法来解决这个问题那样工作。因此,基本上,我对应该怎么做有一些想法,这样我就可以了解并自己解决。

到目前为止,我已经尝试了两种解决方案。

  • 第一个解决方案:

添加文本框,将文本框绑定到变量,然后尝试将数据触发器绑定到文本框。

此解决方案的主要问题是,TwoWay绑定由于某种原因而无法正常工作,当变量的值更改时,按钮的checked属性会更改,但是按按钮则无济于事。

<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">

(为简化起见,省略了不必要的属性)

对于仅具有2个状态变量(真/假)的toggleButton(或按钮),此绑定可以正常工作,但现在的问题是我的变量具有4个状态。

因此,我正在考虑将数据触发器绑定到绑定到按钮的任何对象。所以像这样:

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

将其绑定到自身。或使用:

 "{Binding RelativeSource={RelativeSource Self} 

但两者均无效。

1 个答案:

答案 0 :(得分:0)

为您提供的解决方案是创建转换器,将值0、1、2、3转换为true或false,然后将其出价到ToggleButton中的IsCheck属性。 转换器喜欢它:

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>

最好考虑并尝试一下。我敢肯定它将起作用。