mvvm - 使用 Caliburn 将 SL4 TreeView 绑定(bind)到 IGrouping

标签 mvvm treeview silverlight-4.0 caliburn igrouping

我刚刚开始接触 SL 世界,并尝试使用 Caliburn NavigationShell 作为我的起点。我将解决方案转换为 SL4 并使用 trunk 中的 Caliburn。

为了创建基本导航,我有点不确定(嗯,相当),我如何才能将按钮的原始 StackPanel 显示为可折叠的 Treeview。

我将 ITaskBarItem 更改为拥有一个简单的 GroupName 属性

public interface ITaskBarItem : IEntryPoint
{
    BitmapImage Icon { get; }
    string DisplayName { get; }
    string GroupName { get;}
}

然后,我在 ShellViewModel 中将其公开给 View :

    public IEnumerable<IGrouping<string, ITaskBarItem>> TaskBarItems
    {
        get { return _taskBarItems.GroupBy(t => t.GroupName); }
    }

如何进行 xaml 标记以获得简单的层次结构?

如何在不使用按钮的情况下绑定(bind)操作?

> GroupName
    DisplayName
    DisplayName
    DisplayName

> GroupName
    DisplayName
    DisplayName
    DisplayName
    ...

注意,这是 MVVM,所以我不会使用代码隐藏或事件来做到这一点...

最佳答案

这里有几个困难。首先,这是我的标记:

<ItemsControl x:Name="TaskBarItems">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Converter={StaticResource groupName}}"
                            FontWeight="Bold" />
                <ItemsControl ItemsSource="{Binding}"
                                Margin="12 0 0 0">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding DisplayName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

和我的外壳:

public class ShellViewModel : IShell
{
    readonly TaskBarItemViewModel[] taskBarItems;

    public ShellViewModel()
    {
        taskBarItems = new[]
            {
                new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Monkey"},
                new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Cat"},
                new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Dog"},
                new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Biotite"},
                new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Phlogopite"},
                new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Lepidolite"},
            };
    }

    public IEnumerable<IGrouping<string, TaskBarItemViewModel>> TaskBarItems
    {
        get
        {
            return taskBarItems.GroupBy(t => t.GroupName).ToList();
        }
    }
}

Calibrun Micro (cm) 将按照约定绑定(bind)项目控件、TaskBarItems。然而,由于一些原因,其余的不会按照惯例工作。它位于 DataTemplate 中,因此我们通常会使用 Bind.Model。但是,它在这里不起作用,因为 itemscontrol 中每个项目的类型都是通用的 (IGrouping)。默认约定无法处理为此查找 View 。所以我们提供了一个内联数据模板。

其次,Key 属性似乎是作为显式接口(interface)实现的。这意味着 Silverlight 无法绑定(bind)到它。我制作了一个简单的转换器,可以绑定(bind)到组并提取 key :

public class GroupNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((IGrouping<string,TaskBarItemViewModel>)value).Key;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

接下来,由于分组本身就是 IEnumerable,我们必须直接绑定(bind)嵌套项控件的 ItemsSource。我们不能使用约定,因为 IGrouping 上没有返回项目的属性。 (尽管如果有,我们可能仍然会遇到显式接口(interface)问题。)

关于你的第二个问题。您可以将操作绑定(bind)到任何事件。请参阅此处的文档: http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation

关于mvvm - 使用 Caliburn 将 SL4 TreeView 绑定(bind)到 IGrouping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762361/

相关文章:

wpf - 如何强制 ItemContainerGenerator 为项目生成容器或如何在启用 UI 虚拟化时将 TreeView 滚动到展开节点?

silverlight - SL 4 版本 hell ?未安装 Silverlight 开发人员运行时请安装匹配的版本

silverlight - 如何在 Silverlight 4 中使换行文本与按钮内嵌?

silverlight - 在 Silverlight 4 中拖放文件上传?

c# - listBox.ItemContainerGenerator.ContainerFromItem为null

javascript - YUI TreeView (覆盖 labelClick)

c# - WPF 从单独的绑定(bind)到 ViewModel

Javascript TreeView 以编程方式

c# - 当子所有者窗口的所有者窗口最小化时最小化 WPF 中的子窗口

c# - 如何将按钮命令绑定(bind)到成员方法?