避免ItemsControl中具有由转换器设置的单选按钮值的无限循环

本文关键字:设置 单选按钮 无限循环 转换器 ItemsControl 避免 | 更新日期: 2023-09-27 18:28:26

我在WPF中有这段代码每个新表单都可以通过单击"添加新表单"添加到项目控件中。

活动是CSLA的电话。

<Menu Grid.Row="0">
        <MenuItem Header="Add New"
                    csla:InvokeMethod.MethodName="AddNew"
                    csla:InvokeMethod.TriggerEvent="Click" />
    </Menu></ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate >
                <DataTemplate.Resources>
                    <FrameworkElement x:Key="ReqProxyElement" DataContext="{Binding}" />
                </DataTemplate.Resources>
                <Grid>
                    <ContentControl Visibility="Collapsed" Content="{StaticResource ReqProxyElement}" />
                    <Grid>
                        <Grid.DataContext>
                            <formviewmodels:ReqViewModel Model="{Binding Source={StaticResource ReqProxyElement}, Path=DataContext}"  />
                        </Grid.DataContext>
                        <formviews:ReqView />
                    </Grid>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

现在在表单ReqView中,我有一个单选按钮的转换器调用。

<Label Grid.Row="10" Grid.Column="0" Content="required"  />
    <StackPanel Orientation="Horizontal" Grid.Row="10" Grid.Column="1" >
        <!--<RadioButton Content="Yes" GroupName="Required" IsChecked="{Binding Model.Required, Converter={StaticResource NullableBooleanToFalseConverter}}"></RadioButton>
        <RadioButton Content="No" GroupName="Required" IsChecked="{Binding Model.Required, Converter={StaticResource ReverseBoolean}}"></RadioButton>-->
        <RadioButton Content="Yes" GroupName="GRequired" ></RadioButton>
        <RadioButton Content="No" GroupName="GRequired" ></RadioButton>
    </StackPanel>

在这个场景中,当我单击addNew时,ItemsControl(野兽的本质)试图绑定回Form,并在转换器调用中进入无限循环。转换器代码如下所示。

public class ReverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            return (!((bool)value));
        }
        return false;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            return (!((bool)value));
        }
        return value;
    }
}
public class NullableBooleanToFalseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return false;
        }
        return value;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

任何人都能想出一个解决方案,让转换器不把代码踢进无限循环吗。当单击"添加新表单"时,如果项目控件中已经有表单,它会在创建新的空表单之前尝试再次绑定回该表单。绑定返回会将单选按钮设置为true,比如如果选择了true,但随后将其设置为trus会在两个转换器之间开始一场网球比赛,一个转换它,另一个转换回它,模型会说值不可能是true,依此类推,直到应用程序到达stackerflow。。。

我在WPF和MVVM模式中遇到了一个有趣的情况。我正在寻找一个不打破MVVM范式的解决方案。如果转换器可以取消,那也会起作用。后端调用是CSLA重新封装的属性。

谢谢Dhiren

避免ItemsControl中具有由转换器设置的单选按钮值的无限循环

您只能绑定Yes无线电。由于它的IsChecked属性绑定到您的bool,因此当您检查其他无线电时,bool将变为false。这里甚至不需要ReverseConverter

更新:
仅将Yes无线电绑定到您的字段。当CCD_ 5在同一组中时,它们是互斥的。选择其中一个时,将更改另一个。如果选择No收音机,则将取消选中"是",因此Required将为false

至于初始值,如果将No设置为false,则会选择它。由于Yes绑定到Required,它将保存您的价值。这样做:

<RadioButton Content="Yes" GroupName="GRequired" IsChecked="{Binding Required}"/>
<RadioButton Content="No" GroupName="GRequired" IsChecked="False"/>

更新二:
WPF中的绑定机制将两个值绑定在一起,因此当其中一个值发生更改时,另一个值也会发生更改,并且可以双向工作。RadioButton.IsCheck只是一个布尔属性,所以当它的值发生变化时,它会改变绑定到的值(在本例中为Required)。当您选中No时,也取消选中Yes,它的IsChecked属性将更改。并且改变CCD_ 17
有关数据绑定的详细信息,请参阅:http://msdn.microsoft.com/en-us/library/ms752347.aspx.

所以,你看,你不需要ReverseConverter,因为你不需要将No绑定到任何东西。事实上,您甚至不需要NullBooleanConverter,因为WPF已经知道如何将bool?转换为bool

问候,
Yoni