避免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
您只能绑定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