在WPF中,我有一个堆栈面板,其items控件定义了一个数据模板。此数据模板是一个单选按钮。 items source是我视图模型上的名称集合。
因此,对于视图模型中的每个名称,堆栈面板上会出现一个单选按钮,其旁边有该文本名称(使用内容属性)。
所有这些单选按钮都将组设置为“名称”,因此选择是互斥的。
我的问题是,我将所选单选按钮的内容绑定到我的视图模型“selectedName”上的属性有哪些选择?
理想情况下,我想要一个无代码的UI绑定。
三江源
答案 0 :(得分:1)
您可以为每个RadioButton创建一个ViewModel。它应该公开属性以绑定RadioButton的Checked和一些事件来通知主ViewModel。
答案 1 :(得分:1)
我不确定你是否可以在没有任何事件处理的情况下利用那里的互斥性。通常我有MenuItems或按钮组的问题,我的方法是使用Multibindings和EqualityConverter,例如。
<Setter Property="IsChecked">
<Setter.Value>
<MultiBinding Converter="{StaticResource EqualityComparisonConverter}" Mode="OneWay">
<!-- This binding should find your VM and bind to your property -->
<Binding RelativeSource="{RelativeSource AncestorType=Window}"
Path="DataContext.SelectedName"/>
<!-- Binds to the item being templated -->
<Binding />
</MultiBinding>
</Setter.Value>
</Setter>
转换器(它不是很安全,如果其中一个值为null则抛出异常,可能需要改进它):
public class EqualityComparisonConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2) throw new Exception("At least two inputs are needed for comparison");
bool output = values.Aggregate(true, (acc, x) => acc && x.Equals(values[0]));
return output;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
实际上,这对我来说有点神秘(考虑到绑定是单向的)......
答案 2 :(得分:1)
您可能会发现此链接很有用,建议您解决问题,但不幸的是它不是免代码的:
http://www.wpftutorial.net/RadioButton.html
正如文章中所述,在radioButton上存在数据绑定问题......所以开发人员必须努力使其工作!