У меня есть окно 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;
}
}
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
необходимо.
BoolToStrValueConverter
тоже.