[wpf] كيفية تنفيذ قائمة مربع من مربعات الاختيار في وف؟



1 Answers

على افتراض TopicList ليس ObservableCollection<T> وبالتالي عند إضافة عناصر لا INotifyCollection تغيير لإطلاق محرك ملزمة لتحديث القيمة.

تغيير القائمة الخاصة بك إلى ObservableCollection<T> الذي سيحل المشكلة الحالية. هل يمكن أيضا ملء List<T> في وقت مبكر ثم الربط سوف تعمل عن طريق أونواي. ولكن ObservableCollection<T> هو نهج أكثر قوة.

تصحيح:

يجب أن يكون TopicList الخاص بك خاصية لا متغير عضو؛ تتطلب الروابط خصائص. أنها لا تحتاج إلى أن يكون DependencyProperty .

إديت 2:

تعديل ItemTemplate لأنه لا يحتاج إلى أن يكون HierarchicalDataTemplate

   <ListBox.ItemTemplate>
     <DataTemplate>
       <StackPanel>
         <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/>
       </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate>
Question

على الرغم من أن من ذوي الخبرة إلى حد ما مع كتابة وينفورمز التطبيقات، و "الغموض" من وف لا يزال يضحك لي من حيث أفضل الممارسات وأنماط التصميم.

على الرغم من ملء قائمتي في وقت التشغيل، يظهر قائمتي ليست فارغة.

لقد اتبعت التعليمات البسيطة من هذه المادة مفيدة دون جدوى. أظن أنني في عداد المفقودين نوعا من طريقة DataBind() حيث أقول مربع القائمة التي أنا فعلت تعديل القائمة الأساسية.

في MyWindow.xaml بلدي، لدي:

    <ListBox ItemsSource="{Binding TopicList}" Height="177" HorizontalAlignment="Left" Margin="15,173,0,0" Name="listTopics" VerticalAlignment="Top" Width="236" Background="#0B000000">
        <ListBox.ItemTemplate>
            <HierarchicalDataTemplate>
                <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/>
            </HierarchicalDataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

في بلدي التعليمات البرمجية وراء، لدي:

    private void InitializeTopicList( MyDataContext context )
    {
        List<Topic> topicList = ( from topic in context.Topics select topic ).ToList();

        foreach ( Topic topic in topicList )
        {
            CheckedListItem item = new CheckedListItem();
            item.Name = topic.DisplayName;
            item.ID = topic.ID;
            TopicList.Add( item );
        }
    }

والتي، من خلال تتبع من خلال، وأنا أعلم يجري ملء مع أربعة عناصر.

تصحيح

لقد غيرت TopicList إلى ObservableCollection . لا يزال لا يعمل.

    public ObservableCollection<CheckedListItem> TopicList;

إديت # 2

لقد أجريت تغييرين يساعدان:

في الملف .xaml:

ListBox ItemsSource="{Binding}"

في شفرة المصدر بعد ملء القائمة:

listTopics.DataContext = TopicList;

أحصل على قائمة، ولكن لا يحدث تحديث تلقائي لحالات مربع الاختيار عند تحديثها. أظن أن قراءة أخرى قليلا من جهتي سوف تحل هذا.




البعض الآخر قدمت بالفعل اقتراحات مفيدة (استخدام مجموعة يمكن ملاحظتها للحصول على إشعار قائمة التغيير، وجعل جمع خاصية بدلا من حقل). وهنا هما لم:

1) كلما كنت تواجه مشكلة مع ربط البيانات، والنظر في نافذة الإخراج للتأكد من أنك لا تحصل على أي أخطاء ملزمة. يمكنك قضاء الكثير من الوقت في محاولة لإصلاح مشكلة خاطئة إذا كنت لا تفعل هذا.

2) فهم دور تغيير إعلام يلعب في ملزمة. لا يمكن نشر التغييرات في مصدر البيانات ولن يتم نشرها إلى واجهة المستخدم ما لم ينفذ مصدر البيانات إشعار التغيير. هناك طريقتان للقيام بذلك للخصائص العادية: جعل مصدر البيانات مشتق من DependencyObject وجعل الخاصية التابعة خاصية تبعية أو جعل مصدر البيانات تنفيذ INotifyPropertyChanged ورفع الحدث PropertyChanged عندما تتغير قيمة الخاصية. عند ربط عنصر ItemsControl إلى مجموعة، استخدم فئة مجموعة تنفذ INotifyCollectionChanged (مثل ObservableCollection<T> )، بحيث يتم نشر التغييرات على محتويات وترتيب المجموعة إلى عنصر تحكم مقيد. (لاحظ أنه إذا كنت ترغب في نشر تغييرات على العناصر الموجودة في المجموعة إلى عناصر التحكم المحظورة، فيجب على تلك العناصر تنفيذ إشعار التغيير أيضا.)






Related