8

我搜索了高低,找不到答案。我有两个问题

  1. 如何在 XAML 中创建数组或集合。我有一个数组,我想插入其中并绑定到组合框。我的第一个想法是将 ItemsControl 放在资源字典中,但组合框的 ItemsSource 需要 IEnumerable,所以这不起作用。

这是我在资源字典中尝试过的,但都不起作用

<ItemsControl x:Key="stateList">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
    <ComboBoxItem>AL</ComboBoxItem>
    <ComboBoxItem>CA</ComboBoxItem>
    <ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>

这就是我绑定它的方式

<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}"  >

                    </ComboBox>

编辑:更新

我让第一部分以这种方式工作

 <col:ArrayList x:Key="stateList3">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</col:ArrayList>

但是,我宁愿不使用数组列表,我想使用通用列表,所以如果有人知道如何请告诉我。

编辑更新:我猜 XAML 对泛型的支持非常有限,所以也许数组列表是我现在能做的最好的,但如果有人有分析器,我仍然希望在第二个问题上得到帮助

第二。我尝试在我的 XAML 中引用合并的资源字典并遇到问题,因为在 Window.resources 下我拥有的不仅仅是字典,因此它需要我添加 x:Key。添加密钥后,系统将无法再在我的资源字典中找到项目。我不得不将合并的字典移动到 Grid.Resources 。理想情况下,我想在 app.xaml 中引用合并的字典,但我有同样的问题

这是一些示例代码。第一部分需要一个 x:key 来编译,因为我有转换器,它抱怨说如果有多个项目,每个项目都必须有一个密钥

<UserControl.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

我不得不把它改成这个

<UI:BaseStep.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />             
</UI:BaseStep.Resources>
<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourcesD.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
</Grid>

谢谢

4

4 回答 4

19

据我了解您的问题,您想将 ComboBox(或 ListBox)与一组项目绑定,对吗?如果您想要来自某些外部数据源的项目,您可以使用方便的 DataContext 属性。搜索 MSDN 以了解更多信息。但是,如果您确实想要手动收集,请这样做:

创建自己的类:

public class StringCollection : ObservableCollection<string> { }

现在像这样使用它:

<Window.Resources>
    <local:StringCollection x:Key="stringCollection">
        <sys:String>Hello</sys:String>
        <sys:String>World</sys:String>
    </local:stringCollection>
</Window.Resources>

...

    <ListBox
        Margin="15"
        ItemsSource="{StaticResource stringCollection}" />

或者,如果您想要更通用的集合,请创建一个像这样的类:

public class ObjectCollection : ObservableCollection<object> { }

并像这样使用它:

    <local:ObjectCollection x:Key="objectCollection">
        <sys:String>Hello</sys:String>
        <TextBlock>World</TextBlock>
        <sys:Int32>12345</sys:Int32>
    </local:ObjectCollection>

    ...

    <ComboBox
        Margin="15"
        ItemsSource="{StaticResource objectCollection}" />



您可能还想使用一些内置类Int32Collection,例如 implements IEnumerable。您可以直接将它们用作资源。


任何like 、或)Resources属性的类型不是资源字典的集合!所以你不能这样做: FrameworkElementWindowUserControlApplicationResourceDictionary

<UserControl.Resources>

    <!-- The first RD -->
    <!--<ResourceDictionary>
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    </ResourceDictionary>-->

    <!-- Second RD!!! -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

而是这样做:

<UserControl.Resources>

    <!-- 
        There should be only 1 main RD, 
        Merge other RDs, if any
     -->
    <ResourceDictionary>

        <!-- First Resource -->
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />

        <!-- Second Resource -->
        <ResourceDictionary.MergedDictionaries>
            <!-- Now, there can be multiple RDs -->
            <ResourceDictionary Source="/ResourcesA.xaml" />
            <ResourceDictionary Source="/ResourcesB.xaml" />
            <ResourceDictionary Source="/ResourcesC.xaml" />
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>

希望这可以帮助。
问候,
米希尔·戈卡尼

于 2010-03-19T17:27:22.690 回答
1

如果我错了,请纠正我,但我认为你想要这样的东西?

<Grid.Resources>
  <local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>

在您的窗口顶部,您将拥有一个属性:

xmlns:local="clr-namespace:MyNamespace"

在您的代码中,您将拥有:

MyCustomCollection  custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;

绑定将发生在具有如下属性的控件上:

ItemsSource="{StaticResource MyCustomCollection}"
于 2010-03-19T16:13:37.643 回答
1

对于资源,您只需将附加转换器移动到新声明的 ResourceDictionary 中:

<App.Resources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 
于 2010-03-19T17:11:46.363 回答
0

如果您在 Window 的资源中添加资源字典,您将无法在任何地方访问它,而是应该添加“App”的资源(查看 App.xaml 文件)。

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

无论创建任何继承层次结构,这都将在每个 WPF 对象中可用。

于 2010-03-19T16:46:52.240 回答