有没有办法让静态和动态项目填充列表框?
我正在编写一个Windows Phone 7应用程序,并希望在顶部或底部有一个静态listboxItem,然后绑定viewModel中的其他项目。我尝试设置静态listboxItem,然后设置dataTemplate,但静态项目被动态项目替换。
编辑:
我找到了几篇帖子,展示了如何创建一个从listbox继承的自定义控件,它允许多个模板。我如何创建一个自定义控件,为静态项添加一个部分,无论绑定如何都会一直存在。
答案 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}"/>