C# WPF显示带有单选按钮的布尔值
我目前正在制作一个有一些CRUD视图的应用程序。我想在我的一个视图中显示一个布尔值来编辑一行。我用这个答案试图解决这个问题。我可以编辑该行一次,如果我再次尝试,则会出现stackoverflow异常(无论是否更改为布尔值) 资源声明:C# WPF显示带有单选按钮的布尔值,c#,wpf,data-binding,stack-overflow,staticresource,C#,Wpf,Data Binding,Stack Overflow,Staticresource,我目前正在制作一个有一些CRUD视图的应用程序。我想在我的一个视图中显示一个布尔值来编辑一行。我用这个答案试图解决这个问题。我可以编辑该行一次,如果我再次尝试,则会出现stackoverflow异常(无论是否更改为布尔值) 资源声明: <UserControl.Resources> <bconv:BoolInverterConverter x:Key="BoolInverterConverter" /> </UserControl.Resources>
<UserControl.Resources>
<bconv:BoolInverterConverter x:Key="BoolInverterConverter" />
</UserControl.Resources>
如果我忘了提供一些信息,请询问 StackOverFlow异常指向递归/无休止地做某事 我还没有看到您的代码,但是,请随意猜测-检查您绑定的Setter:Survey.isTemplate。您正在分配CLR属性还是绑定属性 例:
由于@sramalingam24的评论,问题已经解决
这应该是一个复选框,而不是一对单选按钮,其中更新一个会调用另一个,从而导致循环和堆栈溢出
我之前使用的helper类可以简单地删除。所需要的只是复选框我遇到了类似的问题,所以我想分享我的发现 原因是您正在使用GroupName GroupName自动重置其余单选按钮。 它确实会触发viewModel中的其他更新属性。 然后您得到了StackOverflow异常,因为第二个单选按钮更新属性的值正好相反 并非总是可以替换复选框上的单选按钮。
例如,如果您将一个属性通过转换器绑定到两个以上的单选按钮上。这应该是一个复选框,而不是一对单选按钮,其中更新一个会调用另一个,导致循环和堆栈overflow@sramalingam24除了复选框在a.t.m.时反转之外,它确实起作用,谢谢:)我刚刚用你提供的链接中的代码和转换器制作了一个小程序。它按预期工作。您提供的代码中没有异常。我的猜测是,它在您的ViewModel中。当你闯入调试器时,调用堆栈会告诉你什么?这正是发生在我身上的事情。将两个单选按钮绑定到相同的布尔属性(其中一个带有invertedbooleanconverter),作为习惯,我将它们作为相同的组名。解决方案正是@Anton建议的:如果您想保持视图模型不变,只需删除单选按钮上的GroupName属性。
<RadioButton Grid.Column="0" GroupName="istemplate"
Content="Yes" IsChecked="{Binding Survey.isTemplate, Mode=TwoWay}" />
<RadioButton Grid.Column="1" GroupName="istemplate" Content="No" Margin="10,0,0,0"
IsChecked="{Binding Survey.isTemplate, Mode=TwoWay, Converter={StaticResource BoolInverterConverter}}" />
[Table("Survey")]
public class Survey : EntityBase
{
[Required, StringLength(50)]
public string Name { get; set; }
public User ConfirmedBy { get; set; }
public Boolean isTemplate { get; set; }
public Assignment Assignment { get; set; }
public User User { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
private string _Name = null;
public string Name
{
get
{
return _Name; // If you do return Name here - it will be overflow exception
}
set
{
_Name = value; // If you do Name = value instead - it will be Overflow exception.
NotifyPropertyChange("Name");
}
}