2016-01-21 57 views
1

這種情況是我有三個單選按鈕,每個按鈕都對應不同的函數評估方式。我有一個文本框,用戶可以在其中輸入值,並且我希望該值與輸入值時選擇的單選按鈕關聯。在後面的代碼中,我有三個變量(每種類型的值都有一個變量),而且當前我維護數據的方式是每次觸發checked或unchecked事件時,我都會將適當的值加載到文本框中,並將舊值適當的變量。值得注意的是,所有三個變量都是相同的類型(字符串)。基於單選按鈕選擇在文本框上切換綁定

我知道這不是最好的方式去關於這個,所以我想知道是否有某種方式來綁定文本框到所有的變量,並讓它顯示基於哪個單選按鈕被選擇的正確值。我有一個預感,它涉及到使用dataconverter多重綁定,但我不知道如何給數據轉換器狀態信息來決定顯示哪個值或它需要存儲舊值的變量(我可以切換到陣列,但我仍然需要能夠在轉換器中獲得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; 
      } 
     } 

我仍然需要一些選中/取消的事件來處理用戶界面但我想減少代碼量並正確處理綁定

+0

發佈一些片斷可能會給你更好的響應 –

+0

@你的建議聯合國幸運謝謝,我加的事件方法的問題 –

回答

1

如果我正確理解你的要求,這裏是我的解決辦法是:

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個布爾屬性並跟蹤每個Checked值要容易得多。

RadioButtonListBoxStyle通常只覆蓋默認的模板來繪製使用單選每ListBoxItem的,就像這樣:

<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> 

這將保持在字典中的每個文本值,以及每個項目的關鍵是相關聯的單選按鈕文本。如果需要擴展或更改也很容易。

+0

我有一個問題關於這個解決方案,當一個單選按鈕,檢查我的例子想要禁用並重新着色使用輸入值的文本框。使用列表框而不是組合在一起的單選按鈕仍然可以通過事件或其他方式來實現這一功能嗎? –

+0

@ user3634149我會使用''來設置一些DataTrigger來根據SelectedItem的值設置文本框的格式。應該有很多網上做的例子,但是如果你被困住了,讓我知道,我可以寫幾個。 – Rachel

相關問題