题
我到处搜索,但找不到这个问题的答案。我有两个问题
- 如何在 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>
谢谢
解决方案
据我了解您的问题,您想要将 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
实现 IEnumerable
. 。您可以直接将它们用作资源。
这 Resources
财产(的 任何 FrameworkElement
喜欢 Window
, UserControl
, , 或者 Application
) 属于类型 ResourceDictionary
不是资源词典的集合!那么你 不能 这样做:
<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>
希望这可以帮助。
问候,
米希尔·戈卡尼
其他提示
如果我错了,请纠正我,但我认为你想要这样的东西?
<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}"
对于资源,您只需将额外的转换器移动到新声明的 ResourceDictionary 中:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</ResourceDictionary>
</App.Resources>
如果您在 Window 的资源中添加资源字典,您将无法在任何地方访问它,而是应该添加在“App”的资源中(查看 App.xaml 文件)。
<App.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
无论创建任何继承层次结构,这都将在每个 WPF 对象中可用。