【问题标题】:Silverlight, how to make List of a UserControl (In ContentControl?)Silverlight,如何制作用户控件列表(在 ContentControl 中?)
【发布时间】:2011-06-11 01:59:38
【问题描述】:

过去几个小时我一直在努力解决这个问题......

我有一个名为“DayItem”的用户控件,我想在另一个名为“DayPanel”的用户控件中显示 48 次。 让我提一下这是以 MVVM 风格完成的,但我只是在体验,直接的方式就可以得到答案。

我在DayPanel 模型中有一个ObservableCollection<DayItem>,在Xaml 中有一个<ItemsPresenter />

如果我愿意

this.ItemsSource = DayItems;

一切正常。 但是,我希望能够像列表一样在 UI 中使用这些 DayItems...以支持多选等。

所以我尝试使用 ContentControl,并将其内容设置为 ObservableCollection。 但它只显示 ObservableCollection 对象的 ToString 文本。 所以我想我需要一个DataTemplete ...... 但为什么我需要一个 DataTemple 来显示一个控件? 它已经在它自己的 Xaml 中设置了样式,我不想再重复它的样式了。

或者我完全错了,无论如何我需要帮助:x

编辑:

我得到了这个工作,说什么 DataType 是不必要的,甚至是不可能的。 在后面的代码中我告诉列表框,它的 ItemSource 是 ObservableCollection。

现在我遇到了其他问题... ListBox 相关... ListBox中的每个控件之间都有Gap,弄乱了布局 而且我还需要想办法通过拖动来选择多个项目...

谢谢你这么胖的帮助

【问题讨论】:

  • ContentControl == 包含 1 元素。显然这里不是正确的选择。您可以将 ContentControl 用作 ItemPlate。

标签: c# silverlight data-binding mvvm user-controls


【解决方案1】:

首先,您需要一个用于 DayItem 用户控件的视图模型。让我们称之为 DayItemViewModel。另外我想你的 DayPanel 也有一个名为 DayPanelViewModel 的视图模型。然后,您的 DayPanelViewModel 将公开 DayItemViewModel 实例的集合:

public class DayPanelViewModel
{
    public ObservableCollection<DayItemViewModel> DayItems { get; set; }
}

然后,在您的 DayPanel.xaml 中:

<UserControl x:Class="DayPanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <DataTemplate x:Key="DayItemTemplate"
                      DataType="{x:Type my:DayItemViewModel}">
            <my:DayItem />
        </DataTemplate>
    </UserControl.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding DayItems}" 
                 ItemTemplate="{StaticResource DayItemTemplate}" />
    </Grid>
</UserControl>

【讨论】:

  • 现在为了简单起见,我不会在 MVVM 中执行此操作,因此我制作了一个列表框,将其绑定到 oberservableList,并尝试制作 DataTemplate,但出现了一个奇怪的错误: XML 命名空间“schemas.microsoft.com/winfx/2006/xaml/presentation”中的类型“DataTemplate”上不存在属性“DataType”。
  • 这真的很奇怪。检查你的 XAML。而且我建议你从一开始就完全实现 MVVM。
  • 在不使用不存在的 DayaType 属性的情况下让它工作,猜想这不是强制性的。无论如何,如果您还有更多要添加的内容,我已经更新了问题:)
【解决方案2】:

尝试使用 ListBox,因为它实现了多选... 此外,如果您的 DayPanelModel 中不包含 DayItems,但 DayItemModel 不包含 DayItemModel,并且设置 ListBox 的 ItemTemplate 以向每个 DayItemModel 显示 DayItem,那么它可能是明智的(对于 MVVM)。

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2011-10-18
    • 2012-08-12
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多