2011-02-28 63 views
1

我有兩個綁定到同一屬性的單選按鈕。單選按鈕有兩個轉換器。但第二個複選框的轉換隻發生在第一次。代碼中是否有錯誤?單選按鈕無法工作的WPF轉換器

<RadioButton Margin="5,1" GroupName="groupValueOrTime" Name="radioButtonTimeDriven" VerticalAlignment="Top" IsChecked="{Binding Path=TriggerType ,Converter={StaticResource dailyTriggerConverter}}" Grid.Column="0" Grid.Row="0" >Time Driven</RadioButton> 
<RadioButton Margin="5,1" GroupName="groupValueOrTime" Name="radioButtonValueDriven" VerticalAlignment="Top" Grid.Column="0" Grid.Row="1" IsChecked="{Binding Path=TriggerType,Converter={StaticResource valueDrivenTriggerConverter}}" >Value Driven</RadioButton> 

代碼:

public class TriggerTypeDailyToBoolProperty:IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //convert from TriggerType to bool: 
     int TriggerType=int.Parse(value.ToString()); 
     if (TriggerType == 0 || TriggerType == 1 || TriggerType == 2 || TriggerType == 3 || TriggerType == 4 || TriggerType == 5 || TriggerType == 6) 
      return true; 
     else 
      return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool isChecked = (bool)value; 
     return (isChecked? 0: -1); 
    } 

    #endregion 
} 

public class TriggerTypeValueDrivenToBoolProperty : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //convert from TriggerType to bool: 
     int TriggerType = int.Parse(value.ToString()); 
     if (TriggerType == 9) 
      return true; 
     else 
      return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool isChecked = (bool)value; 
     return (isChecked ? 9 : -1); 
    } 

    #endregion 
} 
+0

我並不清楚你想如何工作,但我嘗試了你的代碼,它似乎運行良好,所以問題可能是其他問題。你正在執行'INotifyPropertyChanged'並且當你更新'TriggerType'的時候你會拋出'PropertyChanged'嗎?在附註中,您可能需要考慮將第一個Converter中的7個比較更改爲像if(TriggerType> = 0 && TriggerType <= 6)' – 2011-02-28 21:55:08

+0

k ...可以說我有3個觸發器按鈕,每個TriggerType值爲0,1和9.第一次點擊所有3個按鈕,單選按鈕被正確檢查。當我再次點擊第一個btn時,它會調用第一個轉換器,但不檢查第二個轉換器。所以當我點擊最後一個BTN時,這兩個單選按鈕都保持未選中狀態。 (感謝您糾正代碼btw) – batrulz 2011-02-28 23:11:44

回答

1

我想你將需要在你的視圖模型兩種不同的布爾屬性。

請參考下面的示例描述viewmodel。

public class TriggerViewModel : INotifyPropertyChanged 
{ 
    private bool _triggerTypeValue; 
    private bool _triggerTypeTime; 
    public bool TriggerTypeValue 
    { 
     get 
     { 
      return _triggerTypeValue; 
     } 
     set 
     { 
      _triggerTypeValue = value; 
      OnPropertychanged("TriggerTypeValue"); 
      SetTriggerTypeTime(!_triggerTypeValue); 
     } 
    } 

    public bool TriggerTypeTime 
    { 
     get 
     { 
      return _triggerTypeTime; 
     } 
     set 
     { 
      _triggerTypeTime = value; 
      OnPropertychanged("TriggerTypeTime"); 
      SetTriggerTypeValue(!_triggerTypeTime); 
     } 
    } 

    public TriggerViewModel() 
    { 
     _triggerTypeValue = false; 
     _triggerTypeTime = true; 
    } 

    private void SetTriggerTypeTime(bool value) 
    { 
     _triggerTypeTime = value; 
     OnPropertychanged("TriggerTypeTime"); 
    } 

    private void SetTriggerTypeValue(bool value) 
    { 
     _triggerTypeValue = value; 
     OnPropertychanged("TriggerTypeValue"); 
    } 

    private void OnPropertychanged(string propertyName) 
    { 
     if(PropertyChanged!= null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

對於XAML

<RadioButton Margin="5,1" GroupName="groupValueOrTime" Name="radioButtonTimeDriven" 
      VerticalAlignment="Top" IsChecked="{Binding Path=TriggerType}" 
      Grid.Column="0" Grid.Row="0"> 
    Time Driven 
</RadioButton> 

<RadioButton Margin="5,1" GroupName="groupValueOrTime" Name="radioButtonValueDriven" 
      VerticalAlignment="Top" Grid.Column="0" Grid.Row="1" 
      IsChecked="{Binding Path=TriggerType}"> 
     Value Driven 
<RadioButton> 

注意:此方法消除轉換器,讓你保持你的業務邏輯在中央視圖模型。

+1

這是一個有用的答案,請修正格式。 – 2011-03-01 16:07:10

1

組合分組,單選按鈕和綁定不起作用。綁定的一個奇怪特性是,如果您在代碼中設置綁定目標屬性的值,則會禁用綁定。綁定設計似乎在做的假設是,您應該更改目標屬性的唯一方法是使用UI或更改綁定的源屬性,並且如果一段代碼顯式設置綁定的值目標財產,它知道它在做什麼。

不幸的是,這意味着當用戶點擊它們時,分組的單選按鈕會在代碼更改時設置其他代碼的值,從而會中斷它們的綁定。哎呀。

該解決方案的簡單:綁定單選按鈕屬性在視圖模式,消除了分組,並且把邏輯視圖中的模型來處理結合的性質的互斥性質,例如:

private bool _Option1; 

public bool Option1 
{ 
    get { return _Option1; } 
    set 
    { 
     if (value != _Option1) 
     { 
     _Option1 = value; 
     if (value) 
     { 
      Option2 = false; 
      Option3 = false; 
     } 
     } 
     OnPropertyChanged("Option1"); 
    } 
}