我在理解以下行为时遇到了问题(在.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中的错误吗?非常感谢您的帮助!
答案 0 :(得分:0)
这不是错误。 DataTemplate
未应用于ContentControls
。这就是为什么当DataContext
中的ItemsControl
项CheckBox
为DataContext
时,您的示例代码不起作用,但当object
为DataContext
时,它确实有效}。
您不应在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那么一切都按照我的预期工作。
我知道,这种实施方式并不是最好的方式。但现在我理解了这种行为,我感到高兴;)