我有一个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}"/>
该命令工作正常,但列表框绑定没有。我的问题是 - 为什么?
答案 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。