Silverlight ListBox - 静态加绑定项

时间:2010-06-29 17:08:48

标签: silverlight mvvm windows-phone-7

有没有办法让静态和动态项目填充列表框?

我正在编写一个Windows Phone 7应用程序,并希望在顶部或底部有一个静态listboxItem,然后绑定viewModel中的其他项目。我尝试设置静态listboxItem,然后设置dataTemplate,但静态项目被动态项目替换。

编辑:

我找到了几篇帖子,展示了如何创建一个从listbox继承的自定义控件,它允许多个模板。我如何创建一个自定义控件,为静态项添加一个部分,无论绑定如何都会一直存在。

2 个答案:

答案 0 :(得分:1)

如果您正在尝试执行MVVM并且还对ListBox的SelectedItem进行双向绑定,那么将一个集合绑定到ItemsSource属性会更容易/更清晰。

您可以使用静态项目预先填充ViewModel中的集合吗?然后,您可以将动态项目合并到现有的集合中(从Web服务或其他任何内容返回)。看起来您无论如何都希望在ViewModel中使用这种逻辑,只需将一个列表暴露给View以与ListBox一起使用。

答案 1 :(得分:0)

因为有两种不同类型的项目,我认为最好的办法是创建一个自定义ListBox子类,添加一个新的DependencyProperty以允许您绑定并显示第二个列表。这还需要一个新的默认样式,以便在与正常<ItemsPresenter/>相同的ScrollViewer中正确显示第二个列表。

以下是我自定义ListBox的示例:

public class MyListBox : ListBox
{
    public MyListBox()
        : base()
    {
        this.DefaultStyleKey = typeof(MyListBox);
    }

    public static readonly DependencyProperty StaticItemsProperty = DependencyProperty.Register(
        "StaticItems",
        typeof(IList),
        typeof(MyListBox),
        null);

    public IList StaticItems
    {
        get { return (IList)GetValue(StaticItemsProperty); }
        set { SetValue(StaticItemsProperty, value); }
    }
}

然后,您必须将整个默认ListBox样式复制到themes / generic.xaml资源字典中,并将其修改为MyListBox控件的默认样式。我从默认样式(除了TargetType属性)修改的唯一内容是具有原始列表的ScrollViewer的内容:

<Style TargetType="custom:MyListBox">
    <!-- all the same old XAML for the normal ListBox -->
    <ScrollViewer x:Name="ScrollViewer" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}">
        <StackPanel Orientation="Vertical">
            <ItemsControl ItemsSource="{TemplateBinding StaticItems}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding}"/>
                    </DataTemplate>
                 </ItemsControl.ItemTemplate>
            </ItemsControl>
            <ItemsPresenter/>
        </StackPanel>
    </ScrollViewer>
    <!-- rest of the same old ListBox XAML -->
</Style>

正如您所看到的,我修改了通常只包含ListBox的ItemsPresenter的ScrollViewer,并将其替换为StackPanel,其中包含绑定到我添加到MyListBox的新StaticItems DependencyProperty的新ItemsControl。我为此ItemsControl修改了DataTemplate以显示TextBox。具有普通ItemsTemplate的普通ItemsPresenter将显示在ScrollViewer中的静态列表下方。

然后,可以使用此自定义ListBox代替普通ListBox,以绑定到ViewModel中的两个不同列表,包括静态项和动态项。

<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/>