Как условно вставить флажок в элемент списка настроенного ListView?

Я пытаюсь создать настраиваемый ListView, который заполняет каждый элемент списка некоторыми вещами и начальным флажком, если это необходимо. В настоящее время флажок не отображается, поэтому я предполагаю, что мой код материала ContentControl как-то ошибочен.

<ListView  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ListView.View>
    <GridView>
        <GridViewColumn>
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <!-- Each list item: [Checkbox] Label -->
                    <StackPanel Orientation="Horizontal">
                        <!-- The code for the optional check box -->
                        <ContentControl>
                            <ContentControl.Style>
                                <Style TargetType="ContentControl">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsCheckable}" Value="True">
                                            <Setter Property="Template">
                                                <Setter.Value>
                                                    <ControlTemplate>
                                                        <CheckBox IsChecked="{Binding Path=SomeProperty}" />
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </ContentControl.Style>
                        </ContentControl>
                        <!-- The non-optional test label -->
                        <Label Content="Test Content" />
                    </StackPanel>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </ListView.View>
</ListView>

Код позади:

public partial class MyListView : ListView {
    public MyListView () {
        InitializeComponent();
    }

    public bool IsCheckable
    {
        get { return (bool)GetValue(IsCheckableProperty); }
        set { SetValue(IsCheckableProperty, value); }
    }

    public static readonly DependencyProperty IsCheckableProperty =
        DependencyProperty.Register(
        "IsCheckable", 
        typeof(bool), 
        typeof(AppropriatenessWidget), 
        new UIPropertyMetadata(false));
}

person Bastian    schedule 30.08.2012    source источник
comment
Вызов кода XAML HTML является своего рода оскорблением.   -  person H.B.    schedule 30.08.2012
comment
Ну... сработало ;-). Любые другие подсказки?   -  person Bastian    schedule 30.08.2012
comment
Эта конструкция MyItemsSource ужасна, почему она вообще существует, если вы наследуете что-то с ItemsSource?   -  person H.B.    schedule 30.08.2012
comment
(Во всяком случае, используйте lang-xml или просто xaml для языковых подсказок.)   -  person H.B.    schedule 30.08.2012
comment
Действительные баллы! Я просто удалил MyItemsSource (код немного отличается от исходного).   -  person Bastian    schedule 30.08.2012


Ответы (1)


{Binding IsCheckable} привязывается к DataContext, а не к элементу управления, используйте, например:

{Binding IsCheckable,
         RelativeSource={RelativeSource AncestorType=local:MyListView}}

Также я сомневаюсь, что этот подход к созданию подклассов является хорошей идеей, с этим можно легко справиться с помощью базового DataContext.

person H.B.    schedule 30.08.2012
comment
Благодарю вас! Я не могу вспомнить, сколько времени я уже потратил впустую на то, что Binding-DataContext вызвал проблемы! Если бы был только способ отладить неправильные привязки WPF (помимо того, что вы только что увидели ошибку)... - person Bastian; 30.08.2012
comment
@Bastian: К счастью, есть. - person H.B.; 30.08.2012
comment
Спасибо еще раз! Я попробую эту статью завтра. - person Bastian; 30.08.2012
comment
Ссылаясь на ваше замечание о подклассах по сравнению с использованием DataContext. В чем преимущество последнего перед первым? - person Bastian; 01.09.2012
comment
@Bastian: вам не понадобится новый класс, который ничего не делает. - person H.B.; 01.09.2012
comment
Понятно, что на самом деле есть и другие обязанности, о которых я здесь не упомянул. - person Bastian; 02.09.2012
comment
Я только что обновил свою расширенную версию кода (включая иерархию классов), которая больше не работает. Я добавил код сюда, так как суть его не сильно изменилась. - person Bastian; 13.09.2012
comment
@Bastian: Не меняйте вопрос, если у вас есть другая проблема, задайте другой вопрос. Я не буду заниматься этим. - person H.B.; 13.09.2012
comment
Хорошо, я догадался, что все будет в порядке, поскольку это было вроде эволюция исходной проблемы. - person Bastian; 13.09.2012