WPF конвертеры для переключателей не работают - PullRequest
1 голос
/ 01 марта 2011

У меня есть две радиокнопки, которые привязаны к одному и тому же свойству. Есть 2 конвертера для радиокнопок.Но преобразование для 2-го флажка происходит только в 1-й раз.Что-то не так в коде.

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

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Объединение группировки, переключателей и привязки не работает.Странная особенность привязки заключается в том, что если вы установите значение привязанного целевого свойства в коде, оно отключит привязку.Предположение о том, что дизайн привязки создается, заключается в том, что единственным способом изменения целевого свойства является использование пользовательского интерфейса или изменение свойства источника, с которым он связан, и если фрагмент кода явно устанавливает значение привязкиСвойство target знает, что делает.

К сожалению, это означает, что сгруппированные переключатели, которые устанавливают значения друг друга в коде при их изменении, нарушают привязки, когда пользователь нажимает на них.Упс.

Решение простое: привязать переключатели к свойствам в вашей модели представления, исключить группирование и поместить логику в модель представления для обработки взаимоисключающего характера связанных свойств, например:

private bool _Option1;

public bool Option1
{
   get { return _Option1; }
   set
   {
      if (value != _Option1)
      {
         _Option1 = value;
         if (value)
         {
            Option2 = false;
            Option3 = false;
         }
      }
      OnPropertyChanged("Option1");
   }
}
1 голос
/ 01 марта 2011

Я думаю, вам потребуется иметь два разных логических свойства в вашей модели представления.

Пожалуйста, смотрите ниже пример, изображающий модель представления.

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>

Примечание. Этот подход удаляет конвертеры и позволяет вам сохранять бизнес-логику в модели центрального представления.

...