Привязать содержимое listboxitem к свойству зависимостей списка - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь создать настраиваемый контрольный список проверенных списков в WPF с настраиваемым элементом Checkedlistbox

Xaml-код для selectedlistboxitem:

<Style TargetType="{x:Type local:CheckedListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CheckedListBoxItem}">
                <CheckBox VerticalContentAlignment="Center" Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=Content}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Xaml-код для проверенного списка:

   <Style TargetType="{x:Type local:CheckedListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <local:CheckedListBoxItem Content="{Binding Name}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Проверенный класс Listbox:

 public class CheckedListBox : ListBox
{
    static CheckedListBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CheckedListBox), new FrameworkPropertyMetadata(typeof(CheckedListBox)));
    }



    public string ItemBindingName
    {
        get { return (string)GetValue(ItemBindingNameProperty); }
        set { SetValue(ItemBindingNameProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ItemBindingName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ItemBindingNameProperty =
        DependencyProperty.Register("ItemBindingName", typeof(string), typeof(CheckedListBoxItem), new PropertyMetadata(""));


}

Проверенный класс listboxitem:

public class CheckedListBoxItem : ListBoxItem
{
    static CheckedListBoxItem()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CheckedListBoxItem), new FrameworkPropertyMetadata(typeof(CheckedListBoxItem)));
    }



}

и использование его в окне со следующим кодом xaml:

<GroupBox Grid.Column="2" Style="{StaticResource GroupBoxStyle}"  Header="Choose Categories :" >
        <local:CheckedListBox ItemsSource="{Binding AllCategories}" ItemBindingName="{Binding Name}"  />

    </GroupBox>

Мне нужно следующее:

Чтобы сделать этот customcheckedlistbox настолько обобщенным c, чтобы мне не приходилось вводить имя свойства, к которому я привязываю, в самом шаблоне (т.е. я хочу чтобы удалить часть Content = "{Binding Name}" из шаблона), вместо этого я создал свойство зависимостей с именем "ItemBindingName" для флажка selectedlist, и я хочу, чтобы шаблон элемента связывал свойство, имя которого содержится в свойстве ItemBindingName (т.е. когда я пишу ItemBindingName = "{Binding xxx}" в объявлении checklistbox, шаблон автоматически привязывается к свойству "xxx")

Извините, если моя очередь Звучание звучит недостаточно понятно, я очень старался упростить его, это лучшее, что я могу получить.

1 Ответ

0 голосов
/ 02 февраля 2020

Ваш класс CheckedListBox должен переопределить следующие методы. В PrepareContainerForItemOverride это установит sh привязку содержимого.

protected override DependencyObject GetContainerForItemOverride()
{
    return new CheckedListBoxItem();
}

protected override bool IsItemItsOwnContainerOverride(object item)
{
    return item is CheckedListBoxItem
        || base.IsItemItsOwnContainerOverride(item);
}

protected override void PrepareContainerForItemOverride(
    DependencyObject element, object item)
{
    if (!string.IsNullOrEmpty(ItemBindingName))
    {
        ((ContentControl)element).SetBinding(
            ContentControl.ContentProperty, new Binding(ItemBindingName));
    }
}

Как примечание, привязка содержимого в ControlTemplate CheckedListBoxItem может выглядеть просто так:

<CheckBox Content="{TemplateBinding Content}" ... />
...