Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF单选按钮选择值命令绑定_Wpf_Silverlight - Fatal编程技术网

WPF单选按钮选择值命令绑定

WPF单选按钮选择值命令绑定,wpf,silverlight,Wpf,Silverlight,在WPF中,我有一个堆栈面板,其项控件定义了一个数据模板。此数据模板是一个单选按钮。items源是“我的视图模型”上的名称集合 因此,对于视图模型中的每个名称,堆栈面板上都会出现一个单选按钮,旁边有该名称的文本(使用content属性) 所有这些单选按钮都将组设置为“名称”,因此选择是互斥的 我的问题是,将所选单选按钮的内容绑定到视图模型“selectedName”上的属性时,我有哪些选项 理想情况下,我需要一个UI绑定,即无代码绑定 谢谢您可以为每个单选按钮创建一个ViewModel。它应该公

在WPF中,我有一个堆栈面板,其项控件定义了一个数据模板。此数据模板是一个单选按钮。items源是“我的视图模型”上的名称集合

因此,对于视图模型中的每个名称,堆栈面板上都会出现一个单选按钮,旁边有该名称的文本(使用content属性)

所有这些单选按钮都将组设置为“名称”,因此选择是互斥的

我的问题是,将所选单选按钮的内容绑定到视图模型“selectedName”上的属性时,我有哪些选项

理想情况下,我需要一个UI绑定,即无代码绑定


谢谢

您可以为每个单选按钮创建一个ViewModel。它应该公开属性以绑定RadioButton的选中项和一些事件,从而通知master ViewModel。

我不确定您是否可以在不进行任何事件处理的情况下使用其中的互斥性。通常我对菜单项或按钮组有这个问题,我的方法是使用带有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,则引发异常,可能希望对其进行改进):

公共类EqualityComparisonConverter:IMultiValueConverter
{
#区域IMultiValueConverter成员
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
如果(values.Length<2)抛出新异常(“至少需要两个输入进行比较”);
bool output=values.Aggregate(真,(acc,x)=>acc&&x.Equals(值[0]);
返回输出;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotSupportedException();
}
#端区
}

实际上,这对我来说有点神秘(考虑到绑定是单向的)…

考虑过这一点,但不是我最喜欢的选项
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
}