0

我尝试制作一个自定义的 ListView,如果具体的继承类希望这样,它会用一些东西和一个初始 Checkbox 填充每个列表项。目前没有显示复选框,所以我猜我的 ContentControl 代码在某种程度上是错误的。

<UserControl x:Class="local:MyListView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="some/path/here">
<ListView>
<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, RelativeSource={RelativeSource AncestorType=local:MyListView}}" 
                                                     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>
</UserControl>

背后的代码:

abstract partial class MyListView {
    protected MyListView () {
        InitializeComponent();
    }

    protected abstract bool IsCheckable { get; }
}

// A checkbox should be displayed - but it's not...
public class MyListView1 : MyListView {
    protected bool IsCheckable { get { return true; } }
}

public class MyListView2 : MyListView {
    protected bool IsCheckable { get { return false; } }
}

在检查输出窗口时,我发现了以下消息(我不知道如何使用):

System.Windows.Data 信息:10:无法使用绑定检索值,并且不存在有效的备用值;改用默认值。绑定表达式:路径=IsCheckable;DataItem='MyListView2' (名称=''); 目标元素是'ContentControl'(名称='');目标属性是“NoTarget”(类型“对象”)

System.Windows.Data 错误:39:BindingExpression 路径错误:在“对象”“MyListView2”(名称=“”)上找不到“IsCheckable”属性。绑定表达式:路径=IsCheckable;DataItem='MyListView2' (名称=''); 目标元素是'ContentControl'(名称='');目标属性是“NoTarget”(类型“对象”)

System.Windows.Data 信息:19:由于缺少信息,BindingExpression 无法检索值。绑定表达式:路径=IsCheckable;DataItem='MyListView2' (名称=''); 目标元素是'ContentControl'(名称='');目标属性是“NoTarget”(类型“对象”)

System.Windows.Data 信息:20:BindingExpression 无法从空数据项中检索值。当绑定被分离或绑定到没有值的 Nullable 类型时,可能会发生这种情况。绑定表达式:路径=IsCheckable;DataItem='MyListView2' (名称=''); 目标元素是'ContentControl'(名称='');目标属性是“NoTarget”(类型“对象”)

MyListView1 出现相同的错误消息。请注意,这个问题源于旧帖子的演变。

4

1 回答 1

0

根据msdn Binding Sources Overview:

用作绑定的绑定源属性的属性必须是类的公共属性。不能出于绑定目的访问显式定义的接口属性,也不能访问没有基本实现的受保护、私有、内部或虚拟属性。

于 2012-09-14T13:53:53.077 回答