Радиокнопки представляют перечисляемые значения.Текстовое поле в этом случае будет представлять открытое значение.То, что вы, кажется, хотите, это набор открытых значений, а также предварительно установленный выбор перечисляемых значений.Элемент управления, который лучше всего представляет это поле со списком.
Если вы решите продолжить использование переключателя / текстового поля, вы можете адаптировать метод, используемый людьми для привязки переключателей к перечисляемому значению, за исключением использованиястроковое поле / преобразователь типа строкового поля вместо преобразователя типа поля перечисления / поля перечисления.
См. этот ответ, чтобы узнать, как привязать перечисления: Как связать RadioButtons с перечислением?
Чтобы приспособить это к строкам, просто создайте класс с именем KnownStringToBooleanConverter
(обратите внимание, что эта реализация идентична EnumToBooleanConverter
):
public class KnownStringToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
Также создайте тип с известными строками (аналогично тому, как вы бы создали перечисление):
public static class KnownCountryCodes
{
// Note: I'm guessing at these codes...
public const string England = "EN";
public const string Japan = "JP";
}
Затем привяжите это аналогичным образом:
<RadioButton IsChecked="{Binding Path=SelectedCountryCode, Converter={StaticResource KnownStringToBooleanConverter}, ConverterParameter={x:Static local:KnownCountryCodes.England}}" />
<RadioButton IsChecked="{Binding Path=SelectedCountryCode, Converter={StaticResource KnownStringToBooleanConverter}, ConverterParameter={x:Static local:KnownCountryCodes.Japan}}" />
Если вы хотите, чтобы все ваши элементы управления пересекались, то выВам нужно будет реализовать INotifyPropertyChanged
в вашей модели представления:
public class MyViewModel : INotifyPropertyChanged
{
// Bind this to TextBox and radio buttons. Populate the radio buttons manually
public string SelectedCountryCode
{
get
{
return selectedCountryCode;
}
set
{
selectedCountryCode = value;
RaiseNotifyPropertyChanged("SelectedCountryCode");
}
}
/* Todo: Implement NotifyPropertyChanged and RaiseNotifyPropertyChanged here */
private string selectedCountryCode;
}
Когда введено пользовательское значение (которого нет в списке), переключатели будут тусклыми.Когда вы вводите значение из списка, загорается соответствующий переключатель.Когда вы выбираете правильный переключатель, значение будет изменено в текстовом поле.
Этот материал View / ViewModel называется MVVM.Смотри: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx