如何在 ReadioButton 上设置 String ViewModel 属性 检查我们在 WPF 中

本文关键字:检查 属性 我们 WPF ViewModel String ReadioButton 设置 | 更新日期: 2023-09-27 18:31:56

我是WPF的新手,在这里,当在我的窗口中选中特定的单选按钮时,我正在尝试设置我的viewModel的简单字符串属性。

class ViewModel
{
  string LanguageSettings {get;set;}
}

XAML 如下所示:

 <RadioButton Name="OptionEnglish" GroupName="LanguageOptions" IsChecked="{Binding LanguageSettings, Converter={StaticResource Converter}, ConverterParameter=English}" Content="English" HorizontalAlignment="Right" Width="760" />
        <RadioButton Name="OptionChinese" GroupName="LanguageOptions" IsChecked="{Binding LanguageSettings, Converter={StaticResource Converter}, ConverterParameter=Chinese}" Content="Chinese" />

我已经实现了IValueConvert,如下所示:

 public class BoolInverterConverter : IValueConverter
    {
        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                return !(bool)value;
            }
            return value;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                return !(bool)value;
            }
            return value;
        }
        #endregion
    }

可能我没有正确理解IValueConverter的效用。我认为如果我适当地更改它,它可能会起作用。

我在这里想要的是,当选择英语时,我希望将语言设置设置为英语,中文也是如此。有什么简单的方法可以做到吗? 有没有直接的方法来设置该属性?

所以我有两个选择

1.更改我的布尔转换器实现2. 找到另一种更简单的方法。

有什么想法吗?

如何在 ReadioButton 上设置 String ViewModel 属性 检查我们在 WPF 中

一种不需要转换器的方法:

<RadioButton Content="Chinese" IsChecked="{Binding IsChinese}"/>
<RadioButton Content="English" IsChecked="{Binding IsEnglish}"/>

视图模型:

public class LanguageSelectorViewModel
{
    private bool _isChinese;
    private bool _isEnglish;
    public bool IsChinese
    {
        get { return _isChinese; }
        set
        {
            _isChinese = value;
            if (value)
                SelectedLanguage = "Chinese";
        }
    }
    public bool IsEnglish
    {
        get { return _isEnglish; }
        set
        {
            _isEnglish = value;
            if (value)
                SelectedLanguage = "English";
        }
    }
    public string SelectedLanguage { get; set; }
}

你应该考虑实现IValueConverter。 以下是我相信您正在寻找的内容的起始示例:

public class StringMatchConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
    {
        return value == parameter;
    }
    public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用法示例:

<!-- Somewhere in resources -->
<conv:StringMatchConverter x:Key="Conv" />
<!-- Somewhere in application -->
<RadioButton Name="OptionEnglish" GroupName="LanguageOptions" IsChecked="{Binding LanguageSettings,Converter={StaticResource Conv}, ConverterParameter=English}" Content="English" HorizontalAlignment="Right" Width="760" />
<RadioButton Name="OptionChinese" GroupName="LanguageOptions" IsChecked="{Binding LanguageSettings,Converter={StaticResource Conv}, ConverterParameter=Chinese}" Content="Chinese" />

我不确定,但如果我理解你正确,你可能会使用 IValueConverter。

一种方法是创建一个附加属性:

public class MyAttachedProperty
{
    public static readonly DependencyProperty IsCheckedToStrProperty =
        DependencyProperty.RegisterAttached("IsCheckedToStr", typeof (string), typeof (MyAttachedProperty), new PropertyMetadata(default(string,IsCheckedToStr)))
        private static void IsCheckedToStr(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RadioButton radio = d as RadioButton;
            radio.Checked+=radio_Checked;
        }
        private static void radio_Checked(object sender, RoutedEventArgs e)
        {
            RadioButton radio = sender as RadioButton;
            if (radio.IsChecked == true)
            {
                SetIsCheckedToStr(radio, radio.Content.ToString());
            }
        }
    public static void SetIsCheckedToStr(UIElement element, string value)
    {
        element.SetValue(IsCheckedToStrProperty, value);
    }
    public static string GetIsCheckedToStr(UIElement element)
    {
        return (string) element.GetValue(IsCheckedToStrProperty);
    }
}

然后你可以在你的 xaml 中使用它,就像这样:

<RadioButton Name="OptionEnglish" GroupName="LanguageOptions" local:MyAttachedProperty.IsCheckedStr="{Binding LanguageSettings}" Content="English" HorizontalAlignment="Right" Width="760" />
<RadioButton Name="OptionChinese" GroupName="LanguageOptions" local:MyAttachedProperty.IsCheckedStr="{Binding LanguageSettings}" Content="Chinese" />