C# 基于单选按钮选择在文本框上切换绑定

C# 基于单选按钮选择在文本框上切换绑定,c#,wpf,C#,Wpf,场景是,我有三个单选按钮,每个按钮对应于函数的不同计算方式。我有一个文本框,用户可以在其中输入值,我希望该值与输入值时选择的单选按钮关联。在代码隐藏中,我有三个变量(每种类型的值一个),我当前维护数据的方式是每次触发选中或未选中事件时,我都将正确的值加载到文本框中,并将旧值存储在正确的变量中。值得注意的是,所有三个变量都是相同的类型(字符串) 我知道这不是最好的方法,所以我想知道是否有办法将文本框绑定到所有变量,并根据选择的单选按钮显示正确的值。我有一个预感,它涉及到使用数据转换器的多重绑定,但

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

我知道这不是最好的方法,所以我想知道是否有办法将文本框绑定到所有变量,并根据选择的单选按钮显示正确的值。我有一个预感,它涉及到使用数据转换器的多重绑定,但我不确定如何给数据转换器状态信息,以决定显示哪个值或需要将旧值存储到哪个变量(我可以切换到数组,但我仍然需要能够在转换器中获得radiobox选择)。如果你能给我一些关于如何做这件事的指导,那就太好了。如果不清楚我是否在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;
            }
        }
抽样检查事件

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];
    }
}

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

发布一些片段可能会给您带来更好的效果response@un-幸运的是,感谢您的建议,我在关于此解决方案的问题1中添加了一个事件方法示例,当其中一个单选按钮被选中时,我想禁用并重新激活use输入值的文本框。使用列表框而不是组合在一起的一组单选按钮,是否仍然可以通过事件或其他方式实现此功能?@user3634149我将使用
设置一些数据触发器,以根据SelectedItem的值格式化文本框。网上应该有很多这样做的例子,但是如果你被卡住了,请告诉我,我可以给你写一些。