WPF, MultiBinding CSV в список флажков и лучших практик MVVM

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

  •  28-09-2019
  •  | 
  •  

Вопрос

Я относительно новый для всей идеи WPF и MVVM, и я ищу советы по лучшей практике. У меня есть решение, которое работает, но ощущается, что мне не хватает большого синтаксиса XAML, который упрощает все это.

У меня есть строковое поле в таблице базы данных, которая хранится как CSV, например, «Cat, Dog». Возможно, я должен был сделать это как отношение многих ко многим в мою модели данных сущности, но это другое обсуждение наилучшей практики.

В моем XAML я использую Multibinding на списке, который содержит флажки. Доменой возможного варианта выбора определяется во время выполнения, и в списке генерирует флажки с использованием 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 для использования обработчиков событий для изменения моего просмотра ModeModel таким образом?

Заранее спасибо за любые предложения, Рэй

Это было полезно?

Решение

Рентген

Если вы все еще со мной, вопрос в том, что лучше сделать это?

Я нашел это с WPF, если вы задаете этот вопрос, вероятно, является лучший способ. Есть только так много вариантов (по сравнению с WiMpy WinForms).

Настраивает ли это некоторая цель MVVM для использования обработчиков событий для изменения моего просмотра ModeModel таким образом?

ИМХО, да, это нарушает MVVM. У вас не должно быть кода ViewModel (кроме того, настроив привязку ViewModel) в вашем кодовом режиме.

Вы должны выполнить свои события ICommand(ы), которые выставляются вашим ViewModel (IE Add, удаление). Увидеть EventToCommand что, вероятно, применимо к вашему CheckBox_Checked и CheckBox_UnChecked События.

-jberger

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top