在ItemsControl中避免无限循环,其中radiobutton值由转换器设置

时间:2013-08-21 15:27:31

标签: c# wpf mvvm itemscontrol converters

我在WPF中有这段代码 通过单击Itemscontrol的“Add New”添加每个新表单。

事件是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>

在这种情况下,当我点击添加New时,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;
    }
}

任何人都可以提出一个解决方案,其中包含的代码不会将代码置于无限循环中。 当点击Add New时会发生什么,如果Itemscontrol中已有表单,它会在创建新的空表单之前再次尝试绑定回表单。 绑定返回设置单选按钮是真的如果选择为true但是然后将其设置为trus,则会启动两个转换器之间的网球匹配,一个转换它,另一个将其转换回来,模型说没有方法值是真的等等它去了直到应用程序达到stackoverflow ...

有趣的情况我已经遇到了WPF和MVVM模式。我正在寻找一种不破坏MVVM范式的解决方案。如果转换器可以完成,那也将工作。 后端调用是CSLA注册的属性。

由于 Dhiren

1 个答案:

答案 0 :(得分:0)

您只能绑定Yes电台。由于它的IsChecked属性绑定到你的bool,当你检查另一个无线电时,bool会变为false。你甚至不需要ReverseConverter

<强>更新
只将Yes无线电绑定到您的字段。 RadioButton在同一组(他们是)时是互斥的。当您选择一个时,您将更改另一个。如果您选择No广播,则会取消选中“是”,因此Required将为false

对于初始值,如果将No设置为false,则会选中它。由于Yes绑定到Required,因此它会节省您的价值。做这样的事情:

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

更新II:
WPF中的绑定机制将两个值绑定在一起,因此当一个更改时另一个值也会绑定,并且它可以双向工作。 RadioButton.IsCheck只是一个bool属性,所以当它的值改变时,它会改变它绑定的值(在这种情况下为Required)。当您检查No时,您也取消选中Yes,即IsChecked属性更改。这改变了Required  有关数据绑定的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/ms752347.aspx

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

的问候,
约尼