2014-12-10 3 views
0

Я пытаюсь создать настраиваемое поле со списком значений. Таким образом, в основном поле со списком с некоторыми флажками в качестве элементов. Идея состоит в том, чтобы держать весь контроль полностью привязанным, чтобы я мог быть повторно использован в любое время.WPF: привязка данных родственных источников к пользовательскому зависимому свойству

Вот XAML

<ComboBox x:Class="WpfExtensions.Controls.MultiSelectComboBox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfExtensions.Controls" 
      mc:Ignorable="d" d:DesignHeight="23" d:DesignWidth="150"> 
    <ComboBox.Resources> 
     <local:CheckBoxConverter x:Key="CheckBoxConverter" /> 
    </ComboBox.Resources> 
    <ComboBox.ItemTemplateSelector> 
     <local:MultiSelectBoxTemplateSelector> 
      <local:MultiSelectBoxTemplateSelector.SelectedItemsTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MultiSelectComboBox}}, Path=SelectedItems, Converter={StaticResource CheckBoxConverter}}" /> 
       </DataTemplate> 
      </local:MultiSelectBoxTemplateSelector.SelectedItemsTemplate> 
      <local:MultiSelectBoxTemplateSelector.MultiSelectItemTemplate> 
       <DataTemplate> 
        <CheckBox Content="{Binding}" HorizontalAlignment="Stretch" 
         Checked="CheckBox_Checked" Unchecked="CheckBox_Checked" Indeterminate="CheckBox_Checked" Click="CheckBox_Checked" /> 
       </DataTemplate> 
      </local:MultiSelectBoxTemplateSelector.MultiSelectItemTemplate> 
     </local:MultiSelectBoxTemplateSelector> 
    </ComboBox.ItemTemplateSelector> 
</ComboBox> 

И код позади для пользовательских свойств «SelectedItems»

public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems", typeof(IList), typeof(MultiSelectComboBox)); 

[Bindable(true)] 
public IList SelectedItems 
{ 
    get 
    { 
     return (IList)GetValue(SelectedItemsProperty); 
    } 
    private set 
    { 
     SetValue(SelectedItemsProperty, value); 
    } 
} 

Теперь, когда я проверить проект, то RelativeSource не будет решено правильно по отношению к самому элементу управления, однако Связывание на пути «SelectedItems» выходит из строя с отладчиком, заявляющим, что такого пути нет в объекте RelativeSource.

Я испортил привязку или сделал полную логическую ошибку?

+1

Вы настраиваете источник не относительный источник, делает изменения, что это исправить? RelativeSource = {...} – ndonohoe

ответ

1

Вы устанавливаете RelativeSource как источник, вместо того, чтобы установить RelativeSource propperty как так:

<TextBlock Text="{Binding Path=SelectedItems, RelativeSource={RelativeSource AncestorType={x:Type local:MultiSelectComboBox}}, Converter={StaticResource CheckBoxConverter}}" /> 
+0

О, моя ... какая ошибка d ***. ;) – Adwaenyth