Как создать плиточное меню WPF

229
18 декабря 2017, 11:54

Есть страница разделенная Grid'ом. Нужно в одну ячейку поместить динамически созданные элементы управления (кнопки в виде плиток), причем используя условие. Если сomboBox.SelectedItem = ... , то создать определенное количество элементов. Если значение сomboBox.SelectedItem изменилось, то удалить элементы управления, и создать новые. Количество зависит от того, что будет выбрано в comboBox.

Как пример, вот такое меню:

Answer 1

Окей, смотрите, что должно быть.

Для начала, VM. Допустим, у нас есть список яблок и список груш.

enum ProductType
{
    Apples, Pears
}

Нам нужна коллекция всех продуктов:

public static IEnumerable<ProductType> AllProductTypes { get; } =
    Enum.GetValues(typeof(ProductType)).Cast<ProductType>();

И свойство с INotifyPropertyChanged:

private ProductType currentProduct;
public ProductType CurrentProduct
{
    get => currentProduct;
    set => Set(ref currentProduct, value);
}

(я пользуюсь базовым классом отсюда).

Это мы привяжем к комбобоксу:

<Combobox ItemsSource="{x:Static local:YourVM.AllProductTypes}"
          SelectedItem="{Binding CurrentProduct}"/>

Теперь, список. Пускай у нас есть список сортов яблок и список сортов груш.

class Product { }
class AppleVariety : Product { }
class PearVariety : Product { }
IEnumerable<Product> AllProducts = ...;
IEnumerable<AppleVariety> AllApples = AllProducts.OfType<AppleVariety>().ToList();
IEnumerable<PearVariety> AllPears = AllProducts.OfType<PearVariety>().ToList();

Теперь, нам нужно свойство, представляющее собой текущий список — яблоки или груши.

IEnumerable<Product> currentSelection;
IEnumerable<Product> CurrentSelection
{
    get => currentSelection;
    set => Set(ref currentSelection, value);
}

Затем, нам нужно при изменении значения CurrentProduct менять и список. Сделаем это в сеттере CurrentProduct: вместо

    set => Set(ref currentProduct, value);

напишем там

    set => if (Set(ref currentProduct, value)) CurrentSelection = GetCurrentProductList();

и соответственно

IEnumerable<product> GetCurrentProductList()
{
    switch (CurrentProduct)
    {
    case Apples:
        return AllApples;
    case Pears:
        return AllPears;
    default:
        throw new InvalidOperationException("Unknown product kind");
    }
}

Отлично, теперь отображение.

Тут всё просто. Список продуктов показываем так:

<ListView ItemsSource="{Binding CurrentSelection}>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="3"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- тут код для отображения вашего продукта -->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListView>

Вот вроде бы и всё.

READ ALSO
Ошибка &#39;Resource.Layout&#39; does not contain a definition for &#39;Main&#39;

Ошибка 'Resource.Layout' does not contain a definition for 'Main'

Данная ошибка возникает даже после запуска только созданного проекта Xamarin Android в VisualStudio 2017

313
Использование ресурсов без распаковки

Использование ресурсов без распаковки

Можно ли поместить в библеотеку необходимые ресурсы и пользоваться ими без распаковки?

223
pdfsharp кириллица

pdfsharp кириллица

Есть такой код

337
Что будет если будет запущено 2 процеса

Что будет если будет запущено 2 процеса

Что произойдет если запустить оба процесса которые описаны ниже:

229