2011-02-28 66 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"); 
    } 
}