выбор радиосвязи, полученный на viewmodel, всегда нулевой, за исключением первого выбора

1

У меня есть окно wpf, в котором есть четыре кнопки выбора переключателя и кнопка отправки. Кнопка Submit привязана к команде StartWork внутри MainWindowViewModel.cs. Эта команда указывает на частный метод для выполнения некоторой работы. Проблема заключается в том, что я получаю выбранный радиоприемник правильно только в первый раз, в той же форме, когда меняю выбор радиоприемника на какой-то другой выбор (кроме первого выбранного). Im получает нуль в качестве значения параметра (строка selectedChoice)

MainWindow.xaml

<Window.Resources>        
        <Helpers:BooleanToStringValueConverter x:Key="BoolToStrValueConverter" />        
    </Window.Resources>

    <Grid>
        <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
            <Label>STATUS:</Label>
            <Label Content="{Binding Path=Status, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="200" />
        </StackPanel>
        <!-- radio buttons -->
        <StackPanel Orientation="Horizontal" Width="288" Height="20" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="100,200,0,0">
            <RadioButton GroupName="Site" x:Name="All" Content="Sve" Width="50" 
                    IsChecked="{Binding Site, ConverterParameter=All, Converter={StaticResource BoolToStrValueConverter}}"/>
            <RadioButton GroupName="Site" x:Name="SelOne" Content="SelOne" Width="90" 
                    IsChecked="{Binding Site, ConverterParameter=SelOne, Converter={StaticResource BoolToStrValueConverter}}"/>
            <RadioButton GroupName="Site" x:Name="SelTwo" Content=" SelTwo " Width="70" 
                    IsChecked="{Binding Site, ConverterParameter= SelTwo, Converter={StaticResource BoolToStrValueConverter}}"/>
            <RadioButton GroupName="Site" x:Name="SelThree" Content=" SelThree " Width="80" 
                    IsChecked="{Binding Site, ConverterParameter= SelThree, Converter={StaticResource BoolToStrValueConverter}}"/>
        </StackPanel>
        <!-- /radio buttons -->
        <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="200, 20, 0, 20">
            <Button Command="{ Binding StartWorkCommand }" Content="Run" Width="100" Height="50" />
        </StackPanel>
    </Grid>

MainWindowViewModel.cs (реализует ViewModelBase.cs)

private ICommand _StartWorkCommand;
private string _Status;
    private string _Site;
public string Status {
   get  {
          return _Status;
        }
   set {
         _Status= value;
         OnPropertyChanged("Status ");
       }
}
public string Site
        {
            get { return _Site; }
            set
            {
                _Site = value;
            }
        }
public ICommand StartWorkCommand {
       get {
              if (_StartWorkCommand == null) {
                    _StartWorkCommand = new RelayCommand(
                       x => this.DoWork(this.Site));
              }
              return _StartWorkCommand;
          }
 }

private void DoWork(string selectedChoice){
     … switch …
}

Опять же, вопрос: почему я получаю правильное значение как параметр метода DoWork только для первого выбранного выбора радио, после чего любой другой выбор является нулевым?

РЕДАКТИРОВАТЬ

public class BooleanToStringValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (System.Convert.ToString(value).Equals(System.Convert.ToString(parameter)))
            {
                return true;
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (System.Convert.ToBoolean(value))
            {
                return parameter;
            }
            return null;
        }
    }
  • 2
    Почтовый индекс для конвертера BoolToStrValueConverter тоже.
  • 0
    Я не могу сказать наверняка, но похоже, что вы пропустили вызов OnPropertyChanged внутри seter для Site, и у вас есть дополнительное место в том же вызове для Status
Показать ещё 2 комментария
Теги:
wpf

1 ответ

4
Лучший ответ

return null; в вашей функции ConvertBack вы получаете.

Вместо этого используйте Binding.DoNothing:

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (System.Convert.ToBoolean(value))
            {
                return parameter;
            }
            return Binding.DoNothing;
        }

null является полностью допустимым значением для объекта, поэтому при запуске конвертера устанавливается для свойства backing значение null. Вы хотите, чтобы он просто игнорировал значение, поэтому Binding.DoNothing необходимо.

  • 0
    спасибо, так быстро
  • 0
    Хороший улов, не знал, что существует. +1
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню