是否可以使List <string>成为xaml中的静态资源?</string>

时间:2011-01-19 18:49:37

标签: c# wpf xaml data-binding binding

如果我想在代码隐藏中绑定类似组合框的内容,我完全没有问题。类似的东西:

List<string> strings = new List<string>();
AddStringsFromDataSourceToList(strings);

comboBox1.ItemSource = strings;

据我所知,在XAML中没有快速而肮脏的方法。对于wpf为其超级简单的数据绑定所接受的所有赞誉,这个简单的东西似乎在C#中更容易实现。有没有比创建DependencyProperty包装器并将它们添加为资源而没有来自intellisense或ObservableCollections的所有帮助更简单的方法?我明白这不是不可能的,但如果这么简单的任务看起来如此深入,我一定会遗漏一些东西......

编辑:为了澄清,添加动态列表是问题,而不是静态数组。正如许多人所指出的那样,手动添加项目非常容易。

4 个答案:

答案 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>

并且还存在用于在例如资源部分中声明(和隐式创建)数据的语法。

也许你可以指出一个更完整的场景,有需求和约束?