Ensemble ListBox Case du Contenu dynamique

0

La question

J'ai un WPF de contrôle de l'utilisateur qui est un ListBox qui contient CheckBoxes.

<UserControl x:Class="AC.CodA.WPF.UserControls.CheckedListBox"
             x:Name="Root"
             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"
             mc:Ignorable="d"
             d:Background="White">
    <StackPanel>
        <ListBox BorderThickness="0"
                 ItemsSource="{Binding ElementName=Root, Path=ItemsSource}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Focusable"
                            Value="False" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <ContentPresenter />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding IsChecked}"
                              Content="{Binding Item}">
                    </CheckBox>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Separator />
        <CheckBox x:Name="DeSelectAll"
                  Content="Select / deselect all"
                  Checked="DeSelectAll_Checked"
                  Unchecked="DeSelectAll_Unchecked" />
    </StackPanel>
</UserControl>

Je suis l'aide de ce contrôle à un autre endroit:

<GroupBox Header="{Binding ElementName=Root, Path=Header, FallbackValue=Header}">
    <user:CheckedListBox ItemsSource="{Binding ElementName=Root, Path=Companies}" />
</GroupBox>

À cet endroit, le Companies la propriété est un ObservableCollection<CheckedListBoxItem<Company>>.

CheckedListBoxItem est une classe avec bool IsChecked propriété et générique T Item de la propriété.

Maintenant, T Item peut-être n'importe quoi. À ce stade, j'ai cette propriété est définie comme la Content de la CheckBox mais la plupart des fois, il en résulte quelque chose d'ambigu, comme AC.CodA.Scripting.Shared.Company.

Est-il un moyen de régler le CheckBox Content en dehors du contrôle de l'utilisateur? Quelque chose comme ceci avec CheckBoxContent:

<GroupBox Header="{Binding ElementName=Root, Path=Header, FallbackValue=Header}">
    <user:CheckedListBox ItemsSource="{Binding ElementName=Root, Path=Companies}" CheckBoxContent="{Binding Item.Name}" />
</GroupBox>

et à l'intérieur de mon objet:

<CheckBox IsChecked="{Binding IsChecked}"
          Content="{Binding CheckBoxContent}">
</CheckBox>
binding c# wpf
2021-11-23 14:51:41
1

La meilleure réponse

1

Ajouter un CheckBoxContent propriété de dépendance à votre UserControls 'fichier code-behind:

public partial class CheckedListBox : UserControl
{
    ...

    public static readonly DependencyProperty CheckBoxContentProperty =
        DependencyProperty.Register(nameof(CheckBoxContent), typeof(object),
            typeof(CheckedListBox));

    public object CheckBoxContent
    {
        get { return GetValue(CheckBoxContentProperty); }
        set { SetValue(CheckBoxContentProperty, value); }
    }
}

...et de le relier à votre balisage XAML:

<CheckBox IsChecked="{Binding IsChecked}"
          Content="{Binding CheckBoxContent,
              RelativeSource={RelativeSource AncestorType=UserControl}}">
</CheckBox>
2021-11-24 15:02:23

Tnx pour la réponse. J'ai fait comme vous l'avez suggéré, mais comment pourrais-je maintenant de remplir ce CheckBoxContent lors de l'utilisation de la CheckedListBox? Prendre une classe Company par exemple, avec une propriété Name. J'ai essayé ce qui suit, mais le contenu est vide: <user:CheckedListBox ItemsSource="{Binding ElementName=Root, Path=Companies}" CheckBoxContent="{Binding Name}" />.
Krowi

Cela fonctionne si vous définissez la propriété à une valeur de chaîne constante, e.g: CheckBoxContent="test"? Ensuite, la liaison à Name échoue.
mm8

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................