Usercontrol与列表框和父控件(MVVM)之间的绑定

时间:2010-06-01 13:07:49

标签: silverlight binding dependency-properties

我有一个UserControl,其中包含一个列表框和几个按钮。

<UserControl x:Class="ItemControls.ListBoxControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Grid>
        <ListBox:ExtendedListBox SelectionMode="Single" ItemsSource="{Binding LBItems}" Height="184">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
        </ListBox>
<Button Command="RemoveCommand"/>
</Grid>
</UserControl>

背后的代码:

public static readonly DependencyProperty RemoveCommandProperty =
 DependencyProperty.Register("RemoveCommand", typeof(ICommand), typeof(ListBoxControl), null);

 public ICommand RemoveCommand
 {
  get { return (ICommand)GetValue(RemoveCommandProperty); }
  set { SetValue(RemoveCommandProperty, value); }
 }

 public static readonly DependencyProperty LBItemsProperty =
 DependencyProperty.Register("LBItems", typeof(IEnumerable), typeof(ListBoxControl), null);

 public IEnumerable LBItems
 {
  get { return (IEnumerable)GetValue(LBItemsProperty); }
  set { SetValue(LBItemsProperty, value); }
 }

我在视图中使用此控件:

<ItemControls:ListBoxControl Height="240" Width="350" LBItems="{Binding Items, Converter={StaticResource ItemsConverter}, Mode=TwoWay}" RemoveCommand="{Binding RemoveCommand}"/>

该命令工作正常,但列表框绑定没有。我的问题是 - 为什么?

1 个答案:

答案 0 :(得分:3)

UserControl中的ListBox未正确绑定到LBItems。 ListBox的DataContext不是您的控件,因此它试图直接从您的ViewModel绑定LBItems。

在UserControl声明中添加DataContext="{Binding RelativeSource={RelativeSource Self}}"。这应该正确地将您的DataContext设置为UserControl并允许您绑定以正确定位LBItems属性。

修改

你的评论提醒了我。您需要将Grid的DataContext设置为UserControl。最简单的方法是将Grid命名为<Grid x:Name="LayoutRoot">,然后在UserControl LayoutRoot.DataContext = this;的构造函数中命名

如果设置UserControl的DataContext,则会破坏VM的绑定,但如果在Grid上设置它们,则顶部绑定仍然有效,UserControl中的所有控件都可以正确绑定到UserControl。