WPF ، متعددة CSV إلى قائمة مربعات الاختيار ، وأفضل ممارسات MVVM

StackOverflow https://stackoverflow.com/questions/4097237

  •  28-09-2019
  •  | 
  •  

سؤال

أنا جديد نسبيًا على فكرة WPF و MVVM بأكملها وأنا أبحث عن نصيحة بشأن أفضل الممارسات. لديّ حل يعمل ، لكن يبدو أنني قد أفتقد بعض بناء جملة XAML الرائع الذي من شأنه أن يبسط كل شيء.

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

في XAML الخاص بي ، أستخدم متعددة المرتبات على مربعات قائمة تحتوي على مربعات اختيار. يتم تحديد مجال الخيارات المحتملة في وقت التشغيل ويقوم قائمة القائمة بإنشاء مربعات اختيار باستخدام datatemplate. ها هو xaml:

    <ListBox Grid.Column="3" Grid.Row="8" Grid.RowSpan="2" Name="brandedProductsListBox" Margin="3" ItemsSource="{Binding Source={StaticResource brandedProductLookup}}" IsSynchronizedWithCurrentItem="True" TabIndex="475">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Margin="3" Content="{Binding Path=BrandedProductName}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
                <CheckBox.IsChecked>
                    <MultiBinding Converter="{StaticResource brandedProductToBoolean}">
                        <Binding Source="{StaticResource projectsView}" Path="BrandedProducts" />
                        <Binding Path="BrandedProductName" />
                    </MultiBinding>
                </CheckBox.IsChecked>
            </CheckBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListBox>

يمكنني استخدام محول للتحقق من مربعات الاختيار المناسبة. حاولت الحصول على طريقة تحويل المحول لتحويل منطقية إلى سلسلة CSV ، لكنني لم أستطع معرفة كيفية الوصول أيّ BrandedProductName عندما تم تمريره كان منطقية. ها هو المحول:

public class BrandedProductToBooleanConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) {
            return false;
        }
        else {
            // The bindings passed in (in order) are: the BrandedProducts field for the current project, 
            // and the Branded Product represented by the current CheckBox.
            string brandedProducts = value[0] as string;
            string brandedProduct = value[1] as string;
            return brandedProducts == null ? false :  brandedProducts.Contains(brandedProduct);
        }
    }

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

لذا ، يقوم بتحويل مربعات الاختيار الصحيحة بشكل صحيح عند تحديد كيان ، ولكن عند إضافة واحدة جديدة ، اكتشفت أنه يمكنني استخدام معالجات الأحداث التي تم فحصها وغير محدّل في خانة الاختيار للكتابة إلى كيانتي ، مثل ذلك:

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        if (projectView.IsAddingNew) {
            CheckBox checkBox = sender as CheckBox;
            NewProject project = projectView.CurrentAddItem as NewProject;
            if (project.BrandedProducts == null) {
                project.BrandedProducts = (string)checkBox.Content;
            }
            else {
                project.BrandedProducts += ", " + (string)checkBox.Content;
            }
        }
        e.Handled = true;
    }

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        if (projectView.IsAddingNew) {
            CheckBox checkBox = sender as CheckBox;
            NewProject project = projectView.CurrentAddItem as NewProject;
            if (project.BrandedProducts != null) {
                project.BrandedProducts = project.BrandedProducts.Replace((string)checkBox.Content + ", ", "").Replace(", " + (string)checkBox.Content, "");
            }
        }
        e.Handled = true;
    }

إذا كنت لا تزال معي ، فإن السؤال هو ما هو أفضل طريقة للقيام بذلك؟ إنه يشبه إلى حد ما التفاح والبرتقال معي باستخدام محول لإنشاء العرض من الكيان ولكن بعد ذلك باستخدام معالجات الأحداث لترجمة تحديثات/أوامر العرض إلى الكيان. هل ينتهك بعض الأهداف من MVVM لاستخدام معالجات الأحداث لتعديل عرض ViewModel الخاص بي بهذه الطريقة؟

شكرا مقدما على أي اقتراحات ، راي

هل كانت مفيدة؟

المحلول

شعاع،

إذا كنت لا تزال معي ، فإن السؤال هو ما هو أفضل طريقة للقيام بذلك؟

لقد وجدت ذلك مع WPF ، إذا كنت تطرح هذا السؤال ، فربما هناك هو طريقة أفضل. هناك الكثير من الخيارات (مقارنة مع Wimpy Winforms).

هل ينتهك بعض الأهداف من MVVM لاستخدام معالجات الأحداث لتعديل عرض ViewModel الخاص بي بهذه الطريقة؟

IMHO ، نعم ، إنه ينتهك MVVM. يجب ألا يكون لديك رمز ViewModel (إلى جانب إعداد ربط ViewModel) في الكود الخاص بك.

يجب أن تنفذ أحداثك ICommand(S) التي تتعرض بواسطة ViewModel (أي إضافة ، إزالة). انظر EventTocommand والتي من المحتمل أن تنطبق على الخاص بك CheckBox_Checked و CheckBox_UnChecked الأحداث.

-جبرجر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top