【问题标题】:WPF layout and specific "data-binding"WPF 布局和特定的“数据绑定”
【发布时间】:2011-12-13 03:41:45
【问题描述】:

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

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

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

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

现在我的(工作)解决方案非常繁琐,我确信存在一个优雅的解决方案..

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

【问题讨论】:

  • 我假设我需要某种数据绑定,可能不是 C# 中的确切含义,因为我希望收藏和最近的对象与菜单图标本身几乎相同,意思是打开正确的窗口,显示工具提示等。我现在正在做的是用“真实”对象的副本动态填充各种事件的堆栈面板。我必须承认 - 这很糟糕......

标签: c# wpf user-interface


【解决方案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 项目,底部面板还公开了一个集合视图。集合视图允许我们跟踪 UI 中的当前选择。

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

当底部面板中的选择发生变化时,窗口视图模型会听到这一点并将所选项目添加到最近面板的 ObservableCollection 中。您显然希望在此处添加逻辑以检查重复项等。

【讨论】:

  • 不使用 MVVM - 对 C# 和 WPF 来说非常新:(谢谢,在阅读一些 MVVM 教程后会尝试理解
  • @BoJl4apa:是的,很遗憾大多数 WPF 教程都不是从 MVVM 开始的。如果您从一开始就使用它,您会发现事情变得容易很多
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多