WPF DataTemplate绑定到没有路径的内容 - 这是一个错误吗?

时间:2018-02-18 16:25:58

标签: c# wpf

我在理解以下行为时遇到了问题(在.Net 4.0中测试过)

首先:以下示例按预期工作:它显示Button内的CheckBox。

C#:

DataContext = new CheckBox();

XAML:

<Button Content="{Binding}"/>

在带有路径(“MyProperty”)的ItemsControl中,它也有效:

C#:

DataContext = new { MyList = new List<object>() { new { MyProperty = new CheckBox() } } };

XAML:

<ItemsControl ItemsSource="{Binding Path=MyList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Path=MyProperty}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

但在没有Path的ItemsControl中,它取代了Button,只显示了CheckBox:

C#:

DataContext = new { MyList = new List<CheckBox>() { new CheckBox() } };

XAML:

<ItemsControl ItemsSource="{Binding Path=MyList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

为什么这个例子不起作用?这是WPF中的错误吗?非常感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

这不是错误。 DataTemplate未应用于ContentControls。这就是为什么当DataContext中的ItemsControlCheckBoxDataContext时,您的示例代码不起作用,但当objectDataContext时,它确实有效}。

您不应在ExcelValue=pandas.ExcelFile("stats.xlsx") Sheet1=ExcelValue.parse("sheet1") var1=Sheet1["Salary in Rs."] var2=var1.tolist() mean1=statistics.mean(var1) # getting mean as 44403.153846153844 mean2=statistics.mean(var2) # getting mean as 44403 / view模型中定义用户界面元素。

答案 1 :(得分:0)

我不会将所描述的行为视为WPF / XAML-bug ItemsControl(与ListView或ListBox相比)没有默认的ItemContainer(作为ListViewItem或ListboxItem)。使用ListBox或ListView,您的示例将起作用。

如果List<Textbox>ItemsSource,则ItemsControl会将ItemsSource中的项目用作ItemContainers,因此TextBoxes将成为ItemContainers,您将成为
System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='CheckBox'
在您的调试输出中,因此您将忽略DataTemplate(如果不指定ItemTemplate,您将遇到相同的问题)。

要解决此问题,您可以从ItemsControl派生并覆盖IsItemItsOwnContainerOverride方法:

  

确定指定的项目是否(或有资格成为)自己的项目   容器

答案 2 :(得分:0)

非常感谢您的回答!

我不知道方法IsItemItsOwnContainerOverride。如果我覆盖它并且总是返回true那么一切都按照我的预期工作。

我知道,这种实施方式并不是最好的方式。但现在我理解了这种行为,我感到高兴;)