我在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
答案 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
。
的问候,
约尼