Активация / деактивация кнопок панели инструментов с помощью Prism - PullRequest
4 голосов
/ 28 марта 2011

Я нахожусь в процессе изучения структуры Prism, и я уже прошел путь.Но мне было интересно, как создавать панели инструментов (и контекстные меню), где каждый модуль может регистрировать свои собственные кнопки.

Для этого примера я хочу, чтобы все кнопки находились в одном элементе управления ToolBar, который находится в моей оболочке.Панели инструментов ItemsSource привязываются к свойству ToolBarItems типа ObservableCollection<FrameworkElement> в модели представления.Элементы могут быть добавлены в эту коллекцию, используя сервис ToolBarRegistry.Это ViewModel:

public class ShellViewModel
{
    private IToolBarRegistry _toolBarRegistry;
    private ObservableCollection<FrameworkElement> _toolBarItems;

    public ShellViewModel()
    {
        _toolBarItems = new ObservableCollection<FrameworkElement>();
        _toolBarRegistry = new ToolBarRegistry(this);
    }

    public ObservableCollection<FrameworkElement> ToolBarItems
    {
        get { return _toolBarItems; }
    }
}

Обратите внимание, что коллекция типа FrameworkElement будет подвергнута рефакторингу, чтобы иметь более конкретный тип, если это окажется правильным решением.

Мой ToolBarRegistry имеет метод для регистрации кнопок изображения:

public void RegisterImageButton(string imageSource, ICommand command)
{
    var icon = new BitmapImage(new Uri(imageSource));

    var img = new Image();
    img.Source = icon;
    img.Width = 16;

    var btn = new Button();
    btn.Content = img;
    btn.Command = command;

    _shellViewModel.ToolBarItems.Add(btn);
}

Я вызываю этот метод из моего OrderModule, и кнопки отображаются правильно.Пока все хорошо.

Проблема в том, как я могу контролировать, когда эти кнопки должны быть снова удалены.Если я перейду к представлению в другом модуле (и иногда к другому представлению в том же модуле), я хочу, чтобы эти специфичные для модуля кнопки снова были скрыты.

Есть ли у вас какие-либо предложения о том, как это сделать?Я неправильно подхожу к этой проблеме или могу изменить то, что у меня уже есть?Как вы решили эту проблему?

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

Я бы не вставил Button экземпляров в ObservableCollection.Вместо этого подумайте об этом подходе:

Создайте ViewModel для кнопок панели инструментов

class ToolBarButtonViewModel : INotifyPropertyChanged
{
    // INotifyPropertyChanged implementation to be provided by you

    public string ImageSource { get; set; }
    public ICommand Command { get; set; }
    public bool IsVisible { get; set; }
}

Затем, конечно, измените тип ToolBarItems на набор из них.

ВShellView, добавьте DataTemplate для ToolBarButtonViewModel и привяжите ItemsSource любого элемента управления панели инструментов к коллекции ViewModels, например:

<DataTemplate>
    <Button Command="{Binding Command}">
        <Button.Content>
            <Image Source="{Binding ImageSource}" />
        </Button.Content>
    </Button>
</DataTemplate>

Теперь вы можете связать Button.Visibility на IsVisible с BooleanToVisibilityConverter для решения вашей непосредственной проблемы.

В качестве дополнительного бонуса вы также можете:

  • Изменить внешний видкнопок панели инструментов полностью из XAML
  • Привязать любое свойство дерева визуалов для кнопки панели инструментов к соответствующим свойствам в ToolBarButtonViewModel

Обновление

Механизмдля включения / выключения кнопок зависит от специфики вашего приложения.Есть много вариантов - вот несколько (помните эту диаграмму при чтении):

  • Реализация INavigationAware в ваших представлениях или моделях представленияи при необходимости включайте / отключайте кнопки
  • Присоединяйте обработчики к событиям IRegionNavigationService интересующей области (областей) и позволяйте обработчикам включать или отключать кнопки
  • Проведите всю навигацию по своему коду (CustomNavigationService) и решите, что делать внутри него
0 голосов
/ 01 апреля 2011

Вот статья на эту тему - она ​​должна помочь с вашими вопросами. Он охватывает наличие модулей, загружающих свои собственные кнопки задач и вкладки ленты.

...