首页 > 解决方案 > Wpf Button 条件绑定到变量

问题描述

我是 WPF 的新手,我面临一个我不太确定如何解决的问题。如果有人能指导我找到解决这个问题的最佳方法,我将不胜感激。

这个绑定必须是双向绑定,所以如果我按下其中一个按钮,变量的值就必须改变。

我有 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 个按钮相同,但按钮 2 将在值为 1 时检查,依此类推。

第二种解决方案如下:

为了给你一个更好的主意,我可以通过这种方式将按钮绑定到变量:

 <CustomToggleButton PlcVarName="varName">

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

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

所以我正在考虑有一个数据触发器绑定到按钮绑定的任何内容。所以是这样的:

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

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

 "{Binding RelativeSource={RelativeSource Self} 

但两者都没有工作。

标签: c#wpfdata-binding

解决方案


我为您提供的解决方案是创建转换器以将值 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>

最好的尊重和尝试。我相信它会起作用的。


推荐阅读