web-dev-qa-db-ja.com

List <string>をxamlの静的リソースにすることは可能ですか?

コードビハインドでコンボボックスのようなものをバインドしたい場合は、まったく問題ありません。何かのようなもの :

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

comboBox1.ItemSource = strings;

私の知る限り、XAMLでこれを行うための迅速で汚い方法はありません。 wpfがその非常に単純なデータバインディングに対して受けているすべての賞賛のために、この単純なことはC#で行うのがはるかに簡単に思えます。 DependencyPropertyラッパーを作成し、それらをリソースとして追加するよりも、インテリセンスやObservableCollectionsに含まれるすべての機能をあまり利用せずに、これを行う簡単な方法はありますか?それは不可能ではないことは理解していますが、そのような単純なタスクが非常に詳細に思える場合は、何かが欠けているに違いありません...

編集:明確にするために、ここでは動的リストの追加が問題であり、静的配列ではありません。多くの人が指摘しているように、手動でアイテムを追加するのは非常に簡単です。

12

確かにあります:

<ComboBox>
    <ComboBoxItem>One</ComboBoxItem>
    <ComboBoxItem>Two</ComboBoxItem>
</ComboBox>

目標に応じて、リソースやインラインitemssources、またはグループ化されたデータを使用するなど、ほぼ同じくらい単純な他の構文があります。xmlデータもあります。最初に試したのは簡単ではなかったので、イライラして手を挙げないでください。私の意見では、wpfは学習曲線の価値があります。

WPFは、Windowsフォームよりも視覚効果を動作から分離するのがはるかに簡単であり、優れた視覚効果をはるかに簡単に作成できるため、賞賛されます。簡単な例を簡単に実行できます。ただし、この場合、簡単な例を実行する方が簡単です。

編集ありどこからプルしますか?依存関係プロパティや監視可能なコレクションを作成する必要はありません。単純なlistプロパティで十分です(その場合、xamlでcollectionviewsourceを使用することを好みます)。また、嫌いな場合は、すべてのXAMLを使用する必要がないことを忘れないでください。しかし、それにもかかわらずWPF用に設計すると、多くのタスク(このような)が簡単になります。

3
Philip Rieck
<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>
38
Nawaz

あなたはこのようなものを探していますか:

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

リストの一部の項目のみを定義する場合は、HenkHoltermanのソリューションを参照してください。ちなみに、配列はリソースや他のタイプとしても宣言できます。

更新

質問が変わったようです。しかし、私はあなたの欲望が何であるかを今は理解していません。コードビハインドにあるコレクションをバインドする場合は、このコレクションを返すパブリックプロパティを作成し、このプロパティを公開するオブジェクトにDataContextを設定して、XAMLでバインディングを定義します。

<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"...

私があなたの質問を正しく理解したことを願っています...

5
HCL

できるよ:

    <ComboBox>
        <ComboBoxItem>one</ComboBoxItem>
        <ComboBoxItem>two</ComboBoxItem>
    </ComboBox>

また、たとえばResourceセクションでデータを宣言(および暗黙的に作成)するための構文もあります。

たぶん、要件と制約を含む、より完全なシナリオを指摘できますか?

1
Henk Holterman