コレクションまたは配列を WPF リソース ディクショナリに追加する
-
21-09-2019 - |
質問
いろいろ検索しましたが、これに対する答えが見つかりません。質問が2つあります
- 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 はジェネリックに対するサポートが非常に限られていると思います。そのため、現時点では配列リストが最善であると思いますが、誰かが答えを持っている場合は、2 番目の質問について助けてもらいたいと思います
2番目。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>
ありがとう
解決
私の知る限り、あなたの問題を理解し、あなたは右、項目の配列にコンボボックス(またはリストボックス)に結合したいですか?あなたには、いくつかの外部データソースからのアイテムが必要な場合は、あなただけの便利な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>
希望これは役立ちます。
よろしく、
Mihir Gokani
他のヒント
私が間違っているが、私はあなたがこのような何かをしたいと思うなら、私を修正してください?
<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>
あなたはウィンドウのリソース内のリソースディクショナリを追加する場合は、代わりにあなたは「アプリケーション」のリソース(App.xamlファイルアウトチェック)に追加する必要があり、どこにでもそれにアクセスすることはできません。
<App.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
このは関係なく、任意の継承階層を作成するすべてのWPFオブジェクトで利用できるようになります。