WPF布局和特定的“数据绑定”
本文关键字:数据绑定 布局 WPF | 更新日期: 2023-09-27 18:12:18
我正在编写一个WPF 95% GUI应用程序,并且需要一个特定的快捷图标行为。一张图片有时比(很多)文字更好,所以这里是基本布局:(作为新用户,无法附加图像…)
http://imageshack.us/f/705/appb.jpg/-底部子菜单中的每个图标代表应用程序中的一个控件"页面"-修复图标。-左边的图标是快捷键-最近和收藏夹-根据点击底部的图标。-我使用堆栈面板作为容器,项目的数量是固定的。-每个控件集都有自己的上下文菜单。
我想要完成的是:当用户单击底部菜单中的一个项目时,我希望它"神奇地出现"在"Recent"面板中。当用户在"最近"面板点击"删除"(上下文菜单)时,我需要(右键单击)图标消失。
现在我的(工作的)解决方案是令人难以置信的麻烦,我相信有一个优雅的…
非常感谢任何建议,丹尼尔。
我想你是在使用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中使用简单的ListBoxes,但是您可以使用任何您喜欢的ItemsControl。
当底部面板中的选择发生变化时,窗口视图模型听到此消息并将选中的项目添加到最近面板的ObservableCollection中。显然,您需要在这里添加逻辑来检查重复项等。