Расширение ListBox с помощью ItemTemplate - PullRequest
0 голосов
/ 23 января 2019

Мне нужно расширить ListBox с помощью пользовательского ItemTemplate, но когда я запускаю свой код, ItemTemplate не применяется?

    <ListBox x:Class="ExtendedCheckedListbox"
                 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:ExtListBoxPOC"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="800">

        <ListBox.ItemTemplate>
            <DataTemplate>
                    <CheckBox Content="{Binding Description}" VerticalAlignment="Stretch" VerticalContentAlignment="Center" />
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>


private YesNoModel YesNo = new YesNoModel();

{
    DataContext = YesNo;
    cbl.ItemsSource = YesNo;

}

Мой XAML главного окна, в котором используется элемент управления cbl, для которого установлен ItemSource.в коде позади:

<Window x:Class="MainWindow"
        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"
        xmlns:local="clr-namespace:ExtListBoxPOC"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:ExtendedCheckedListbox x:Name="cbl" HorizontalAlignment="Left" Height="300" Margin="10" VerticalAlignment="Top" Width="300"/>
    </Grid>
</Window>

Класс Model это:

public class YesNoModel
{
    public string Description { get; set; }
    public int Value { get; set; }
}

И я добавляю элементы здесь:

{
    YesNo.Add(new YesNoModel() { Description = "Yes", Value = 1 });
    YesNo.Add(new YesNoModel() { Description = "No", Value = 2 });
    YesNo.Add(new YesNoModel() { Description = "N/A", Value = 3 });
}

Код позади представления ExtendedCheckedListbox:

public class ExtendedCheckedListbox : ListBox
{
}

1 Ответ

0 голосов
/ 23 января 2019

Ваш производный ListBox просто игнорирует XAML, потому что вы, очевидно, нигде не вызывали InitializeComponent().

Однако обычный способ получить элемент управления - создать стиль по умолчанию в Themes\Generic.xaml. Добавьте «пользовательский элемент управления» в ваш проект Visual Studio и измените его следующим образом:

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

Затем измените содержимое сгенерированного Themes\Generic.xaml файла на это:

<Style TargetType="local:ExtendedCheckedListBox">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <CheckBox Content="{Binding Description}"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Подробнее см. Обзор авторизации управления .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...