gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:02:50 25 4
gpt4 key购买 nike

我刚刚开始接触 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com