我有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。
答案 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