WPF布局和特定的“数据绑定”

时间:2011-10-22 12:20:38

标签: c# wpf user-interface

我正在编写一个WPF 95%的GUI应用程序,需要一个特定的快捷图标行为。 一个图像有时比(很多)单词更好,所以这里是基本布局: (作为新用户,无法附加图像...)

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

- 底部子菜单中的每个图标代表应用程序中的控件“页面” - FIXED图标。 - 根据底部图标的点击,左侧的图标是快捷方式 - 最近和收藏夹。 - 我使用堆叠面板作为容器,物品的数量是固定的。 - 每个控件集都有自己的上下文菜单。

我想要完成的事情如下: 当用户点击底部菜单中的某个项目时,我希望它在“最近”面板中“神奇地显示”。当用户点击“最近”面板中的“删除”(上下文菜单)时,我需要(右键单击)图标消失。

现在我的(工作)解决方案令人难以置信的麻烦,我确信它是一个优雅的解决方案..

非常感谢任何建议, 丹尼尔。

1 个答案:

答案 0 :(得分:1)

我假设你正在使用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,底部面板还公开一个集合视图。集合视图允许我们在UI中跟踪当前选择。

我在示例XAML中使用简单的ListBox,但您可以使用您喜欢的任何ItemsControl。

当底部面板中的选择发生变化时,窗口视图模型会听到此信息,并将所选项目添加到最近面板的ObservableCollection中。你显然想在这里添加逻辑来检查重复等。