Макет WPF и конкретная «привязка данных» - PullRequest
0 голосов
/ 22 октября 2011

Я пишу WPF 95% GUI-приложение, и мне нужно определенное поведение ярлыка.Одно изображение иногда лучше, чем (много) слов, поэтому вот основной макет: (как новый пользователь не может прикрепить изображение ...)

http://imageshack.us/f/705/appb.jpg/

-Каждый значок в нижнем подменю представляет собой управляющую «страницу» в приложении - ИСПРАВЛЕННЫЕ значки.- Значки слева представляют собой ярлыки - последние и избранные - в соответствии с щелчками внизу значков.-Я использую стек-панели в качестве контейнеров, и количество элементов фиксировано.Каждый набор элементов управления имеет свое собственное контекстное меню.

Я пытаюсь выполнить следующее: когда пользователь щелкает элемент в нижнем меню, я хочу, чтобы он «магически появлялся» вНедавняя "панель".Когда пользователь нажимает «удалить» (контекстное меню) на панели «Последние», мне нужно, чтобы значок (щелкнув правой кнопкой мыши) исчез.

Сейчас мое (рабочее) решение невероятно громоздко, и яЯ уверен, что элегантный существует ..

Буду очень признателен за любой совет, Даниэль.

1 Ответ

1 голос
/ 22 октября 2011

Я полагаю, вы используете для этого шаблон MVVM ?Если нет, вы должны быть.

Итак, если вы используете MVVM, вам подойдет что-то вроде этого:

class BottomPanelViewModel
{
    public BottomPanelViewModel()
    {
        Items = new ObservableCollection<PageViewModel>();
        ItemsView = new ListCollectionView(Items);
        ItemsView.CurrentChanged += SelectionChanged;
    }

    public ObservableCollection<PageViewModel> Items { get; private set; }
    public ListCollectionView ItemsView { get; private set; }

}    

class RecentPanelViewModel
{
    public RecentPanelViewModel()
    {
        Items = new ObservableCollection<PageViewModel>();
    }

    public ObservableCollection<PageViewModel> Items { get; private set; }
}

class WindowViewModel
{
    public WindowViewModel()
    {
        BottomPanel = new BottomPanelViewModel();
        RecentPanel = new RecentPanelViewModel();

        BottomPanel.CurrentChanged +=  (s, e) =>
        {
            RecentPanel.Items.Add(BottomPanel.ItemsView.CurrentItem);
        };
    }

    public BottomPanelViewModel BottomPanel { get; private set; }
    public RecentPanelViewModel RecentPanel { get; private set; }
}

В конструкторе окон создайте экземпляр WindowViewModel и используйтеэто как ваш DataContext:

public Window()
{
    InitializeComponent();
    DataContext = new WindowViewModel();
}

Затем в вашем XAML вы можете связать со свойствами WindowViewModel:

<Window ...>
    <DockPanel>
        <ListBox DockPanel.Dock="Bottom" 
                 ItemsSource="{Binding BottomPanel.ItemsView}"
                 IsSynchronizedWithCurrentItem="True"/>
        <ListBox DockPanel.Dock="Left" 
                 ItemsSource="{Binding RecentPanel.Items}"/>
    </DockPanel>
</Window>

Объяснение: WindowViewModel содержит BottomPanelViewModel и RecentPanelViewModel.Каждый из них содержит ObservableCollection of Items, а нижняя панель также предоставляет представление коллекции.Представление коллекции позволяет нам отслеживать текущий выбор в пользовательском интерфейсе.

Я использую простые ListBoxes в примере XAML, но вы можете использовать любой элемент ItemsControl, который вам нравится.

Когда выбор изменяетсяна нижней панели модель представления окна слышит это и добавляет выбранный элемент в коллекцию ObservableCollection последней панели.Вы, очевидно, захотите добавить здесь логику для проверки дубликатов и т. Д.

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