2010-06-01 2 views
0

У меня есть UserControl, который содержит список и несколько кнопок.Связывание между Usercontrol со списком и родительским контролем (MVVM)

<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}"/> 

Команда работает отлично, хотя привязки ListBox не , Мой вопрос - ПОЧЕМУ?

ответ

3

ListBox в вашем UserControl неверно привязан к LBItems. DataContext ListBox не является вашим контролем, поэтому он пытается связать LBItems напрямую с вашей ViewModel.

В вашем объявлении UserControl добавьте DataContext="{Binding RelativeSource={RelativeSource Self}}". Это должно правильно установить ваш DataContext в UserControl и позволить вам привязывать к правильному расположению свойства LBItems.

Редактировать

Ваш комментарий напомнил мне. Вам необходимо установить DataContext вашей сетки в качестве UserControl. Самый простой способ сделать это, чтобы назвать Энергосистемы т.е. <Grid x:Name="LayoutRoot">, а затем в конструкторе для вашего UserControl LayoutRoot.DataContext = this;

Если установить DataContext в UserControl вы ломаете привязки из виртуальной машины, но если установить их на сетке верхние привязки все еще работают, и все элементы управления внутри UserControl могут корректно привязываться к UserControl.

+0

Я пробовал этот код раньше сегодня (this.DataContext = this при инициализации) и просто попробовал это предложение, но все равно не повезло. – Walkor

+0

Я думаю, что знаю проблему. Отредактировал мой ответ, чтобы показать. – Stephan

+0

Удивительный! Большое спасибо, Стефан. Вы сделали свой день, я потратил 10 часов на это. – Walkor

Смежные вопросы