2011-01-19 5 views
12

コードビハインドでコンボボックスのようなものをバインドしたいのであれば、まったく問題はありません。何かのように:リストをxamlの静的リソースとすることは可能ですか?<string>?

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

comboBox1.ItemSource = strings; 

私が言うことができる限り、XAMLでこれを行うための迅速かつ汚れた方法はありません。 wpfが非常に簡単なデータバインディングを受け取っているという賞賛のすべてに対して、この単純なことはC#でやるだけで簡単にできるようです。これを行う簡単な方法は、DependencyPropertyラッパーを作成し、インテリセンスやObservableCollectionsに入るすべての助けを借りずにリソースとして追加することよりも簡単ですか?私はそれが不可能ではないことを理解していますが、そのような単純な作業がそう深く見える場合、何かが欠けているはずです...

EDIT:静的配列ではなく動的リストを追加することが重要です。多くの人が指摘しているように、手動で項目を追加するのは簡単です。

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

をし、また例えば、リソースセクション内のデータを宣言(および暗黙的に作成する)ための構文が存在する:

+1

WPFは、設計から論理を切り離すことができてうれしいことを賞賛します。何かを行うことはできません。 –

+0

@ Disappointment-これはあまりにもクレイジーではありません...確かに "何かとすべて"ではありません。アプリケーションを構築する際の最も一般的なタスクの1つの単純さと問題点。 –

+0

私はそれが狂っていないことを知っています。しかし、いったん満足し始め、「このデータをUIに埋め込みます」という行に沿って作業を始めると、どこで終了するのかが分かります。基本的にUIの一部と見なすことができる「データ」について話している場合、一般的で一定のドロップダウンオプションのリストのように、抽象化され再利用されるのは一般的に利用するコンテナです。私はあなた、質問、または方法ではなく、ちょうどいくつかのことを述べている、BTW。 –

答えて

3

を理解しましたデータ。あなたが試した最初のことは簡単ではなかったので、欲求不満に手を投げないでください.WPFは学習曲線の価値があります。それはWindowsフォームよりもはるかに簡単振る舞いからビジュアルを分離しますので

WPFは、賞賛を取得し、それは素敵な視覚効果を作成しますので、ずっとはるかに簡単で、それはそれが簡単に些細な例を行うにはなりませんので。しかし、この場合、で簡単な例は簡単です。

編集ありどこから引き出しますか?どのような方法でも、依存関係プロパティーや可観測コレクションを作成する必要はありません。シンプルなリストプロパティがあります(私はこの場合xamlでcollectionviewsourceを使います)。また、XAMLをすべて嫌うなら、にはが必要であることを忘れないでください。しかし、それにもかかわらずWPF用に設計すれば、(このような)たくさんのタスクが簡単に見つかります。

+0

申し訳ありませんが、明確ではありませんでしたが、動的コンテンツを追加する方法を探しています(値がわからないリストなど)。 –

+2

@Prof Plum私は理解していないと思います.xamlにコードがない静的リソースを保持したいが、値を動的にしたいのですか?値はいつどこで設定されますか? –

+0

ありがとう、collectionviesourceメソッドには何が含まれていますか?あなたがMSDN以外の簡潔な使い方を示すリンクがあれば、それは非常に役に立つでしょう。 –

1

あなたが行うことができます。

おそらく、要件と制約を満たしたより完全なシナリオを指摘できますか?

+0

は私が実際に何を得ているかを示すために編集されました。 –

+1

これで、宣言的なXAMLに必須のC#を混在させたいと思うようです。関数をプロパティに変換するだけで完了です。 –

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> 

あなただけのリストについては、いくつかの項目を定義したい場合は、ヘンク・Holtermanからソリューションを見てください。ところで、配列をリソースとして宣言したり、他の型として宣言することもできます。

更新

あなたがあなたの質問を変更したようです。しかし、私は今あなたの欲望が何であるか理解していません。

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

希望:あなたがあなたのコードビハインドで持っているコレクションをバインドしたい場合は、このコレクションを返すパブリックプロパティを作り、このプロパティを公開し、XAMLでバインディングを定義するオブジェクトへのDataContextを設定しますリソースまたはインラインitemssources、またはグループ化されたデータを使用して...でも、XML -

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

ほぼ同じくらい簡単です、あなたの目標に応じて、他の構文があります:私は、右のあなたの質問...

が確かに存在し
33
<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> 
+0

ウィンドウレベルでxmlnsを定義することをお勧めします。配列のリソースではなく、これは非常にきれいな固体標準のXAMLです。 – cod3monk3y

+0

あなたのxamlにはがありますが、それはでなければなりません。 6文字未満で編集できません。 – edhedges

+0

@ edhedges:修正されました。ありがとう。 – Nawaz

関連する問題