根据单选按钮选择切换文本框上的绑定

时间:2016-01-21 15:57:00

标签: 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;
            }
        }

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

1 个答案:

答案 0 :(得分:1)

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




 公共类MyViewModel:INotifyPropertyChanged
 {
 public Dictionary< string,string> AvailableItems {get;组; }

 private string _selectedItem;
 public string SelectedItem
 {
 get {return _selectedItem; }
设置
 {
 _selectedItem = value;
 RaisePropertyChanged( “someValue中”);
 RaisePropertyChanged( “值”); //通知价值也发生了变化
 }
 }

 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




 <代码>&LT; ListBox ItemsSource =“{Binding AvailableItems}”&#xA;的DisplayMemberPath = “密钥” &#XA; SelectedValuePath = “密钥” &#XA; SelectedValue =“{Binding SelectedItem}”&#xA; Style =“{StaticResource RadioButtonListBoxStyle}”/&gt;&#xA;&#xA;&lt; TextBox Text =“{Binding Value}”/&gt;&#xA;  
&#xA;& #xA;

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

&#xA;&#xA;

RadioButtonListBoxStyle 通常只是覆盖默认模板以使用RadioButton绘制每个ListBoxItem,如下所示:

&#xA;& #xA;
 &lt; Style x:Key =“RadioButtonListBoxStyle”TargetType =“{x:Type ListBox}”&gt;&#xA; &lt; Setter Property =“BorderBrush”Value =“Transparent”/&gt;&#xA; &lt; Setter Property =“KeyboardNavigation.DirectionalNavigation”Value =“Cycle”/&gt;&#xA; &lt; Setter Property =“ItemContainerStyle”&gt;&#xA; &LT; Setter.Value&GT;&#XA; &lt; Style TargetType =“{x:Type ListBoxItem}”&gt;&#xA; &lt; Setter Property =“Margin”Value =“2,2,2,0”/&gt;&#xA; &lt; Setter Property =“Template”&gt;&#xA; &LT; Setter.Value&GT;&#XA; &LT;&的ControlTemplate GT;&#XA; &lt; Border Background =“Transparent”&gt;&#xA; &LT;单选&#XA; Content =“{TemplateBinding ContentPresenter.Content}”VerticalAlignment =“Center”&#xA; IsChecked =“{Binding Path = IsSelected,RelativeSource = {RelativeSource TemplatedParent},Mode = TwoWay}”/&gt;&#xA;&#xA; &LT; /边框&GT;&#XA; &LT; /&的ControlTemplate GT;&#XA; &LT; /Setter.Value>&#XA; &LT; /设置器&GT;&#XA; &LT; /样式和GT;&#XA; &LT; /Setter.Value>&#XA; &lt; / Setter&gt;&#xA;&lt; / Style&gt;&#xA;  
&#xA;&#xA;

这将使用键维护Dictionary中的每个文本值对于每个项目是相关的RadioButton文本。如果需要,它也很容易扩展或改变。<​​/ p>&#xA;