WPF แสดงบูลีนด้วยปุ่มเรดิโอ

ขณะนี้ฉันกำลังอยู่ในขั้นตอนการสร้างแอปพลิเคชันที่มีมุมมอง CRUD บางส่วน ฉันต้องการแสดงบูลีนในมุมมองใดมุมมองหนึ่งของฉันเพื่อแก้ไขแถว ฉันใช้คำตอบนี้ที่นี่เพื่อลอง และแก้ไขปัญหานี้ ฉันสามารถแก้ไขแถวได้หนึ่งครั้ง หากฉันลองอีกครั้ง ฉันจะได้รับข้อยกเว้นของ stackoverflow (ไม่ว่าฉันจะเปลี่ยนเป็นค่าบูลีนหรือไม่ก็ตาม)

การประกาศทรัพยากร:

<UserControl.Resources>
    <bconv:BoolInverterConverter x:Key="BoolInverterConverter" />
</UserControl.Resources>

ปุ่มตัวเลือก:

<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}}" />

รายการที่ฉันพยายามแก้ไขบูลีน (isTemplate) ของ:

[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; }
}

หากฉันลืมใส่ข้อมูลกรุณาถาม!


person Jjampong    schedule 15.11.2018    source แหล่งที่มา
comment
นั่นควรเป็นกล่องกาเครื่องหมาย ไม่ใช่คู่ของปุ่มตัวเลือก โดยที่การอัปเดตอันหนึ่งเรียกอีกอันหนึ่งซึ่งนำไปสู่วงจรและสแต็กโอเวอร์โฟลว์   -  person sramalingam24    schedule 16.11.2018
comment
@ sramalingam24 ยกเว้นว่ากล่องกาเครื่องหมายกลับด้าน a.t.m. มันใช้งานได้ ขอบคุณ :)   -  person Jjampong    schedule 16.11.2018
comment
ฉันเพิ่งสร้างโปรแกรมขนาดเล็กโดยใช้โค้ดและตัวแปลงจากลิงก์ที่คุณให้ไว้ มันทำงานได้ตามที่คาดไว้ ข้อยกเว้นของคุณไม่ได้อยู่ในรหัสที่คุณระบุ ฉันเดาว่ามันอยู่ใน ViewModel ของคุณ เมื่อคุณเจาะ Debugger Call Stack จะบอกอะไรคุณ?   -  person Nik    schedule 16.11.2018


คำตอบ (3)


ปัญหาได้รับการแก้ไขแล้วด้วยความคิดเห็นของ @ sramalingam24

นั่นควรเป็นกล่องกาเครื่องหมาย ไม่ใช่คู่ของปุ่มตัวเลือก โดยที่การอัปเดตอันหนึ่งเรียกอีกอันหนึ่งซึ่งนำไปสู่วงจรและสแต็กโอเวอร์โฟลว์

คลาสตัวช่วยที่ฉันใช้ก่อนหน้านี้สามารถลบออกได้อย่างง่ายดาย สิ่งที่จำเป็นคือช่องทำเครื่องหมาย

person Jjampong    schedule 16.11.2018

ฉันประสบปัญหาที่คล้ายกัน ดังนั้นฉันจึงอยากแบ่งปันสิ่งที่ฉันพบ

สาเหตุก็คือคุณใช้ GroupName

GroupName จะรีเซ็ตปุ่มตัวเลือกที่เหลือโดยอัตโนมัติ มันจะทริกเกอร์คุณสมบัติการอัพเดตเพิ่มเติมใน viewModel จากนั้นคุณได้รับข้อยกเว้น StackOverflow เนื่องจากคุณสมบัติการอัปเดตปุ่มตัวเลือกที่สองที่มีค่าตรงกันข้าม

ไม่สามารถแทนที่ปุ่มตัวเลือกในช่องทำเครื่องหมายได้เสมอไป ตัวอย่างเช่น ในกรณีที่คุณจะมีคุณสมบัติหนึ่งรายการที่ถูกผูกไว้ผ่านตัวแปลงบนปุ่มตัวเลือกมากกว่า 2 ปุ่ม

person Anton    schedule 26.12.2019
comment
นี่คือสิ่งที่เกิดขึ้นกับฉัน ผูกปุ่มตัวเลือก 2 ปุ่มเข้ากับคุณสมบัติบูลีนเดียวกัน (ปุ่มหนึ่งที่มีตัวแปลงบูลีนกลับหัว) และโดยนิสัย ฉันกำหนดให้มันเป็น GroupName เดียวกัน วิธีแก้ปัญหาตรงตามที่ @Anton แนะนำ: หากคุณต้องการให้โมเดลมุมมองของคุณไม่เปลี่ยนแปลง เพียงลบคุณสมบัติ GroupName บน RadioButtons - person demonllama; 27.02.2020

ข้อยกเว้น StackOverFlow ชี้ไปที่การทำอะไรบางอย่างแบบเรียกซ้ำ/ไม่มีที่สิ้นสุด

ฉันไม่ได้เห็นรหัสของคุณ แต่เดายาก - ตรวจสอบ Setter ของคุณ Binding: Survey.isTemplate คุณกำลังกำหนดคุณสมบัติ CLR หรือคุณสมบัติที่ถูกผูกไว้

Ex:

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");
    }
}
person Prateek Shrivastava    schedule 16.11.2018