Привязка IsChecked свойство RadioButton внутри ItemsControl - PullRequest
0 голосов
/ 27 января 2011

У меня есть ItemsControls с элементами, связанными с CollectionViewSource.

    <ItemsControl ItemsSource="{Binding Source={StaticResource VisibleFlagsImageSourcePathView}}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <r:RibbonRadioButton SmallImageSource="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

И еще один элемент управления:

<TextBox Text="{Binding Path=SelectedCountryCode" />

То, что я пытаюсь выполнить, это когда я меняю значение TextBoxЯ хочу, чтобы соответствующее свойство RibbonRadioButton IsChecked было установлено в true или false.

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

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

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

См. этот ответ, чтобы узнать, как привязать перечисления: Как связать 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

0 голосов
/ 27 января 2011

Что вам нужно сделать, это создать ViewModel с двумя свойствами.

class MyViewModel
{
    // Bind this to TextBox
    public String SelectedCountryCode { get; set; }

    // Bind this to ItemsControl
    public ObservableCollection<Object> VisibleFlagsImageSourcePath { get; set; }
}
// Note I have omitted implementation of `INotifyPropertyChanged`. But, you will need to implement it.

И следите за SelectedCountryCode, и всякий раз, когда он меняется, меняйте соответствующее значение в VisibleFlagsImageSourcePath коллекции.

...