【问题标题】:Wpf Button conditional binding to a variableWpf Button 条件绑定到变量
【发布时间】:2019-04-24 19:54:02
【问题描述】:

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

  • 我有一个从 PLC 获得的变量,该变量的值可以是 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">

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

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

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

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

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

 "{Binding RelativeSource={RelativeSource Self} 

但两者都不起作用。

【问题讨论】:

  • DataTrigger 仅对属性中的更改作出反应。它无法更改它们,因此Mode=TwoWay 对 DataTrigger 无效;它实际上并没有做任何事情。你对这个问题有一些有趣的限制。我的第一选择是使用 4 个 RadioButtons 和一个 ValueConverter(扔掉那个 CustomToggleButton)。

标签: c# wpf data-binding


【解决方案1】:

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

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

【讨论】:

  • 您可以使用3个以上的切换按钮,只需在ConverterParameter中定义您想要的值
猜你喜欢
  • 2011-05-31
  • 2018-11-21
  • 2010-12-01
  • 2011-01-06
  • 2011-02-11
  • 2011-02-23
  • 2014-10-31
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多