पहले उत्तर को दर्शाने के लिए अपडेट किया गया - अभी भी अपेक्षित रूप से काम नहीं कर रहा है

मैंने कम्बोबॉक्स चयनों और सूचियों को बाध्य करने के बारे में कई पोस्ट पढ़ी हैं, लेकिन मैं काम करने के लिए अपना विशेष सेटअप प्राप्त करने में असमर्थ रहा हूं।

मैं एक सूची बॉक्स में एक प्रश्न सेट का चयन करना चाहता हूं। फिर, दूसरे सूची बॉक्स से एक प्रश्न का चयन करें। अंत में, सूची बॉक्स में विकल्पों की सूची से सही उत्तर का चयन करें।

नीचे सभी सूचियों को उचित रूप से पॉप्युलेट करता है लेकिन चयनों को अपेक्षित रूप से सहेज नहीं रहा है। ऐसा लगता है कि सभी उत्तरों को पहले मान पर सेट किया गया है।

समस्या को पुन: प्रस्तुत करने के लिए

नीचे दिए गए कोड का उपयोग करें और प्रश्न सेट 1, प्रश्न 1 के उत्तर को गलत पर सेट करने का प्रयास करें। फिर, प्रश्न सेट 2, प्रश्न 1 को हाँ पर सेट करें।

प्रोजेक्ट सेटअप

मेरे पास 2 सूची बॉक्स और एक कम्बोबॉक्स वाला एक फॉर्म है। ऊपर से नीचे तक: प्रश्न समूह -> प्रश्न -> विकल्प

<Window x:Class="ComboBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ComboBinding"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ListBox x:Name="QuestionSetList" VerticalAlignment="Top" Margin="10,10,329,0" Height="118" SelectionChanged="QuestionSetList_SelectionChanged" />
        <ListBox x:Name="QuestionList" VerticalAlignment="Top" Margin="10,143,329,0" Height="118" SelectionChanged="QuestionList_SelectionChanged" />
        <!--<ComboBox Name="AnswerList" VerticalAlignment="Top" Margin="10,278,329,0" SelectedValue="{Binding SelectedId, Mode=TwoWay}"/>-->
        <ComboBox Name="AnswerList" VerticalAlignment="Top" Margin="10,278,329,0" SelectedValuePath="Id"
            ItemsSource="{Binding OptionData}" 
            SelectedValue="{Binding SelectedId}"
            DisplayMemberPath="Value"/>
    </Grid>
</Window>

मेरा कोड इस प्रकार है

using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;

namespace ComboBinding
{
    public partial class MainWindow : Window
    {
        ObservableCollection<QuestionSet> QuestionSetData = new ObservableCollection<QuestionSet>();

        public MainWindow()
        {
            InitializeComponent();

            QuestionSetData.Add(new QuestionSet { Id = 1, Value = "Question Set 1" });
            QuestionSetData[0].QuestionData.Add(new Question { Id = 1, Value = "1." });
            QuestionSetData[0].QuestionData[0].OptionData.Add(new ComboData { Id = 1, Value = "True" });
            QuestionSetData[0].QuestionData[0].OptionData.Add(new ComboData { Id = 1, Value = "False" });

            QuestionSetData.Add(new QuestionSet { Id = 1, Value = "Question Set 2" });
            QuestionSetData[1].QuestionData.Add(new Question { Id = 1, Value = "1." });
            QuestionSetData[1].QuestionData[0].OptionData.Add(new ComboData { Id = 1, Value = "Yes" });
            QuestionSetData[1].QuestionData[0].OptionData.Add(new ComboData { Id = 1, Value = "No" });
            QuestionSetData[1].QuestionData.Add(new Question { Id = 2, Value = "2." });
            QuestionSetData[1].QuestionData[1].OptionData.Add(new ComboData { Id = 1, Value = "True" });
            QuestionSetData[1].QuestionData[1].OptionData.Add(new ComboData { Id = 1, Value = "False" });

            QuestionSetList.ItemsSource = QuestionSetData;

            QuestionSetList.DisplayMemberPath = "Value";
            QuestionSetList.SelectedValuePath = "Id";
        }

        private void QuestionSetList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            QuestionList.ItemsSource = QuestionSetData[QuestionSetList.SelectedIndex].QuestionData;

            QuestionList.DisplayMemberPath = "Value";
            QuestionList.SelectedValuePath = "Id";
        }

        private void QuestionList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (QuestionList.SelectedIndex != -1)
            {
                AnswerList.DataContext = QuestionSetData[QuestionSetList.SelectedIndex].QuestionData[QuestionList.SelectedIndex];

                //AnswerList.ItemsSource = QuestionSetData[QuestionSetList.SelectedIndex].QuestionData[QuestionList.SelectedIndex].OptionData;
                //AnswerList.DataContext = QuestionSetData[QuestionSetList.SelectedIndex].QuestionData[QuestionList.SelectedIndex].OptionData;

                //AnswerList.DisplayMemberPath = "Value";
                //AnswerList.SelectedValuePath = "Id";
            }
        }
    }

    public class QuestionSet
    {
        public int Id { get; set; }
        public string Value { get; set; }

        public ObservableCollection<Question> QuestionData = new ObservableCollection<Question>();
    }

    public class Question
    {
        public int Id { get; set; }
        public string Value { get; set; }

        //Relocated to Question Class
        public int SelectedId { get; set; }

        public ObservableCollection<ComboData> OptionData { get; set; } = new ObservableCollection<ComboData>();
        //public ObservableCollection<ComboData> OptionData = new ObservableCollection<ComboData>();
    }

    public class ComboData
    {
        public int Id { get; set; }
        
        public string Value { get; set; }
        //public int SelectedId { get; set; }
    }
}
0
Paul Haydock 21 जुलाई 2020, 10:36

1 उत्तर

सबसे बढ़िया उत्तर

सूचना:

  • आपके ComboData की वर्तमान में एक ही ID है। आपको इसे बदलना होगा।
  • इसे कॉम्बोबॉक्स से बाइंड करने के लिए get जोड़ें और Question.OptionData पर सेट करें।

सबसे पहले आपको अपनी SelectedId प्रॉपर्टी को प्रश्न में रखना चाहिए न कि ComboData में। क्योंकि प्रश्न वह है जो चयनित उत्तर जानता है, उत्तर नहीं।

public class Question
{
    public int Id { get; set; }
    public string Value { get; set; }
    public int SelectedId { get; set; }

    public ObservableCollection<ComboData> OptionData { get; set; } = new ObservableCollection<ComboData>();
}

अब DataContext को QuestionList_SelectionChanged में सेट करें

   private void QuestionList_SelectionChanged(object sender, SelectionChangedEventArgs e)
   {
        if (QuestionList.SelectedIndex != -1)
        {
            AnswerList.DataContext = QuestionSetData[QuestionSetList.SelectedIndex].QuestionData[QuestionList.SelectedIndex];
        }
   }

और Xaml में निम्नलिखित के रूप में combobox बांधें:

<ComboBox Name="AnswerList" VerticalAlignment="Top"       
            SelectedValuePath="Id"
            ItemsSource="{Binding OptionData}" 
            SelectedValue="{Binding SelectedId}"
            DisplayMemberPath="Value"/>

आदेश अत्यंत महत्वपूर्ण है। पहले आइटम्ससोर्स और चयनित वैल्यू से बाध्य करें। इस पोस्ट को MSDN

संपादित करें: ComboBox के साथ काम करने और बाइंडिंग के लिए यह भी एक अच्छी व्याख्या है: डब्ल्यूपीएफ कॉम्बोबॉक्स और डेटा बाइंडिंग।

1
BraunSe 21 जुलाई 2020, 18:00