如果我想在代码隐藏中绑定类似组合框的内容,我完全没有问题。类似的东西:
List<string> strings = new List<string>();
AddStringsFromDataSourceToList(strings);
comboBox1.ItemSource = strings;
据我所知,在XAML中没有快速而肮脏的方法。对于wpf为其超级简单的数据绑定所接受的所有赞誉,这个简单的东西似乎在C#中更容易实现。有没有比创建DependencyProperty包装器并将它们添加为资源而没有来自intellisense或ObservableCollections的所有帮助更简单的方法?我明白这不是不可能的,但如果这么简单的任务看起来如此深入,我一定会遗漏一些东西......
编辑:为了澄清,添加动态列表是问题,而不是静态数组。正如许多人所指出的那样,手动添加项目非常容易。
答案 0 :(得分:36)
<Window.Resources>
<x:Array x:Key="strings" Type="sys:String"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
</x:Array>
<!-- likewise -->
<x:Array x:Key="persons" Type="{x:Type local:Person}"
xmlns:local="clr-namespace:namespace-where-person-is-defined">
<local:Person FirstName="Sarfaraz" LastName="Nawaz"/>
<local:Person FirstName="Prof" LastName="Plum"/>
</x:Array>
<Window.Resources>
<ComboBox ItemsSource="{StaticResource strings}" />
<ListBox ItemsSource="{StaticResource persons}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding FirstName}"/>
<Run Text=" "/>
<Run Text="{Binding LastName}"/>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 1 :(得分:5)
你在寻找这样的东西:
<ComboBox>
<ComboBox.ItemsSource>
<x:Array Type="sys:String"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
</x:Array>
</ComboBox.ItemsSource>
</ComboBox>
如果您只想为列表定义一些项目,请查看Henk Holterman的解决方案。顺便说一句,您可以将数组声明为资源和其他类型。
<强>更新强>
您似乎已经改变了自己的问题。但是我现在不明白你的愿望是什么。如果要绑定代码隐藏中的集合,则创建一个返回此集合的公共属性,将DataContext设置为公开此属性的对象,并在XAML中定义绑定:
<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"...
希望我理解你的问题......
答案 2 :(得分:3)
当然有:
<ComboBox>
<ComboBoxItem>One</ComboBoxItem>
<ComboBoxItem>Two</ComboBoxItem>
</ComboBox>
根据您的目标,还有其他语法几乎一样简单 - 使用资源或内联项目源,或分组数据..甚至xml数据。不要沮丧地举手,因为你尝试的第一件事并不容易 - 在我看来,wpf值得学习曲线。
WPF获得好评,因为它使得视觉效果与行为分离比Windows形式更容易,并且因为它使得创建更好的视觉效果更多更容易,而不是因为它使得更容易做一些简单的例子。但是,在这种情况下 - 更容易做一些简单的例子。
通过编辑您想从哪里取出它们?您不必以任何方式创建依赖项属性或可观察集合。一个简单的列表属性会做(在这种情况下我更喜欢在xaml中使用collectionviewsource)。此外,如果您讨厌它,请不要忘记需要使用所有XAML。但是,如果你为WPF设计而不是为它设计,你会发现很多任务(比如这个)很容易。
答案 3 :(得分:1)
你可以这样做:
<ComboBox>
<ComboBoxItem>one</ComboBoxItem>
<ComboBoxItem>two</ComboBoxItem>
</ComboBox>
并且还存在用于在例如资源部分中声明(和隐式创建)数据的语法。
也许你可以指出一个更完整的场景,有需求和约束?