使用Prism激活/取消激活工具栏按钮

时间:2011-03-28 16:04:41

标签: wpf mvvm prism toolbar

我正在学习Prism框架,我已经走过了。但我想知道如何创建工具栏(和上下文菜单),每个模块都可以注册自己的按钮。

对于这个例子,我希望所有按钮都驻留在我的Shell中的同一个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 个答案:

答案 0 :(得分:4)

我不会在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绑定到ViewModel集合,例如:

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

现在,您可以使用BooleanToVisibilityConverterButton.Visibility绑定到IsVisible以解决您的问题。

作为额外奖励,您还可以:

  • 完全从XAML
  • 更改工具栏按钮的视觉外观
  • 将工具栏按钮的可视树的任何属性绑定到ToolBarButtonViewModel
  • 上的相应属性

更新

启用/禁用按钮的机制取决于应用程序的细节。有很多选择 - 这里有几个(在阅读时记住this chart):

  • 在您的视图或ViewModel中实施INavigationAware并根据需要启用/禁用按钮
  • 将处理程序附加到感兴趣区域的events of IRegionNavigationService并让处理程序启用或禁用按钮
  • 通过您自己的代码(CustomNavigationService)路由所有导航并决定在其中执行的操作

答案 1 :(得分:0)

以下是an article on that subject - 它可以帮助您解决问题。它包括让模块加载自己的任务按钮和功能区选项卡。

相关问题