在ItemsControl中绑定RadioButton的IsChecked属性

时间:2011-01-27 10:12:54

标签: wpf xaml binding datatemplate itemscontrol

我有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 :(得分:0)

您需要做的是创建一个包含两个属性的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集合中的相应值。

答案 1 :(得分:0)

单选按钮表示枚举值。在这种情况下,文本框将代表一个开放值。您似乎想要的是一组开放值以及预设的枚举值选择。最能代表这一点的控件是一个组合框。

如果您决定继续使用单选按钮/文本框方法,则可以调整人们用于将单选按钮绑定到枚举值的方法,除了使用字符串字段/字符串字段类型转换器而不是枚举字段/枚举场型转换器。

有关如何绑定到枚举的详细信息,请参阅此答案:How to bind RadioButtons to an enum?

要使其适应字符串,只需创建一个名为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