基于单选按钮选择切换文本框上的绑定

本文关键字:绑定 文本 单选按钮 选择 | 更新日期: 2023-09-27 18:31:16

场景是我有三个单选按钮,每个按钮对应于函数的计算方式。我有一个文本框,用户可以在其中输入值,并且我希望该值与输入值时选择的单选按钮相关联。在后面的代码中,我有三个变量(每种类型的值一个),我当前维护数据的方式是每次触发选中或未选中的事件时,我都会将正确的值加载到文本框中并将旧值存储在正确的变量中。值得注意的是,所有三个变量都是相同的类型(字符串)。

我知道这不是解决此问题的最佳方法,因此我想知道是否有某种方法可以将文本框绑定到所有变量,并使其根据选择的单选按钮显示正确的值。我有一种预感,它涉及将多重绑定与数据转换器一起使用,但我不确定如何为数据转换器提供状态信息以决定要显示哪个值或需要将旧值存储到哪个变量(我可以切换到数组,但我仍然需要能够在转换器中获得单选框选择)。如果你能给我一些关于如何做到这一点的指导,那就太好了。如果不清楚,我正在WPF应用程序上使用C #/Xaml。

我目前拥有的一些片段

示例未选中事件

private void Fixed_Unchecked(object sender, RoutedEventArgs e)
    {
        if (Value != null)
        {
            LastFixedValue = Value.Text;
        }
    }

样本已检查事件

private void Fixed_Checked(object sender, RoutedEventArgs e)
        {
            if (PercentSign != null)
            {
                PercentSign.Visibility = Visibility.Hidden;
            }
            if (Value != null)
            {
                Value.IsReadOnly = false;
                Value.Text = LastFixedValue;
                Value.Background = Brushes.White;
            }
        }

我仍然需要一些选中/未选中的事件来处理 ui 更改,但我想减少代码量并正确处理绑定

基于单选按钮选择切换文本框上的绑定

如果我正确理解您的要求,这是我的解决方案:

public class MyViewModel : INotifyPropertyChanged
{
    public Dictionary<string, string> AvailableItems { get; set; }
    private string _selectedItem;
    public string SelectedItem 
    {
        get { return _selectedItem; }
        set 
        {
            _selectedItem = value;
            RaisePropertyChanged("SomeValue");
            RaisePropertyChanged("Value"); // Notify Value it has changed too
        }
    }
    public string Value
    {
        get { return AvailableItems[SelectedItem]; }
        set { AvailableItems[SelectedItem] = value; }
    }
    public MyViewModel()
    {
        AvailableItems = new Dictionary<string, string>();
        AvailableItems.Add("Fixed", string.Empty);
        AvailableItems.Add("Percent", string.Empty);
        AvailableItems.Add("Variable", string.Empty);
        SelectedItem = AvailableItems[0];
    }
}

XAML

<ListBox ItemsSource="{Binding AvailableItems}"
         DisplayMemberPath="Key"
         SelectedValuePath="Key"
         SelectedValue="{Binding SelectedItem}"
         Style="{StaticResource RadioButtonListBoxStyle}" />
<TextBox Text="{Binding Value}" />

请注意,我为此使用列表框,而不是单独定义每个单选按钮...当我想显示用户只能选择一个项目的项目列表时,这很常见。它比维护 X 个布尔属性和跟踪每个检查值要容易得多。

RadioButtonListBoxStyle通常只是覆盖默认模板以使用单选按钮绘制每个列表框项,如下所示:

<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <RadioButton
                                    Content="{TemplateBinding ContentPresenter.Content}" VerticalAlignment="Center"
                                    IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

这将维护字典中的每个文本值,每个项目的键是关联的单选按钮文本。如果需要,它也很容易扩展或更改。