Вычисление и просмотр колонки вне модели с использованием MVVM - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно решить следующую проблему, используя C # MVVM. Я использую следующую модель. enter image description here

И один из моих пользовательских элементов управления получил следующий шаблон ListBox.

<ListBox ItemsSource="{Binding OrdersListViewViewModel.AllItems, Source={StaticResource Locator}}" SelectedItem="{Binding OrdersListViewViewModel.SelectedItem, Source={StaticResource Locator}}" Background="White">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" Margin="0 0 0 0" Height="Auto" Width="Auto" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel  Margin="0,7,0,6" HorizontalAlignment="Left" Orientation="Horizontal">
            <Image Width="25" Height="25" Margin="5 2 0 0" Source="{Binding OrdersListViewViewModel.OrderDeliveryStateImage, Mode=OneWay, Source={StaticResource Locator}}"/>
            <TextBlock Margin="25,5,25,5"  Text="{Binding OrdersListViewViewModel.AllItems/Customer.CustomerName, FallbackValue=N/A, Mode=OneWay, Source={StaticResource Locator}}" FontSize="20"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

В списке отображаются все заказы (имена клиентов), загруженные из базы данных. Изображение, которое находится рядом с TextBlock, я хочу заполнить рисунком. Если все элементы заказа по заказу были доставлены ( Доставлено = 1 ), он должен использовать picture1, в противном случае picture2.

Так что я связываюсь ObservableCollection<Order>. Модель генерируется из .tt с использованием структуры сущностей (сначала db), поэтому неправильно помещать вычисления непосредственно в класс Order.cs из-за возможных обновлений db.

Моей первой идеей было использование столбца MSSQL Computed , но я думаю, что это не очень хороший подход (в решении может быть много ситуаций, подобных этой), поэтому модель будет огромной и сложной.

Вторая идея состояла в том, чтобы использовать конвертер , но его следует использовать для простых задач, а не для логики вычислений (что это такое).

Третья идея состояла в том, чтобы изменить ObservableCollection<Order> на ObservableCollection<Tuple<string,Order>> и каким-то образом связать его с представлением, но ... вы знаете, это плохая идея.

Так что мой вопрос прост. Как я могу решить эту проблему (, где разместить вычислительную логику этой цели), используя лучший метод MVVM.

Спасибо.

1 Ответ

0 голосов
/ 31 марта 2019

Ну, после поисков, я решил создать это решение.Может быть, это кому-то поможет.Сначала я создал частичный класс сущности Order, чтобы разделить файлы, поэтому, когда структура сущности обновит сущность Order, она не будет перезаписывать мои настройки.

Затем я создал пользовательское свойство, которое определяет, является ли Orderбыло доставлено.Таким образом, логика вычислений все еще остается в модели.

  public partial class Order
    {
        public bool IsOrderDelivered
        {
            get
            {
                int orderDelivered = 1;
                foreach (var orderItem in this.OrderItems)
                {
                    orderDelivered = orderDelivered * orderItem.Delivered;
                }
                return orderDelivered == 1 ? true : false;
            }
        }

    }

Затем я создал конвертер, который просто преобразует логическое значение в текст, поэтому он существует и используется правильно.

public class OrderStatusToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool)value == true ? @"Skins\approved.png" : @"Skins\denied.png";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

И создал привязку данных для моего нового свойства в частичном классе вместе с конвертером.

       <StackPanel  Margin="0,7,0,6" HorizontalAlignment="Left" Orientation="Horizontal">
                    <Image Width="25" Height="25" Margin="5 2 0 0" Source="{Binding IsOrderDelivered, Converter={StaticResource OrderStatusToImageConverter}, Mode=OneWay}"/>
                    <TextBlock Margin="25,5,25,5"  Text="{Binding Customer.CustomerName, FallbackValue=N/A, Mode=OneWay}" FontSize="20"/>
       </StackPanel>

И, наконец, визуальный эффект.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...