2009-05-19 11 views
0

私のシナリオ: wpfフォームにはテキストボックスとwpfツールキットdatagridがあります。 テキストがテキストボックスに入力されると、私のサービスはIEnumerable<TranslationItem>の項目を返します。私は、このサービスの結果を示すために私のDataGridに欲しい。wpfデータバインディングで頭を包むことができません

私はグーグルで回りましたが、頭や尻尾を手に入れることはできません。私はWPFを学び始めていて、使用された用語のほとんどは私を逃してしまいます。
私が収集するのは、サービスの結果をObservableCollectionに入れなければならないということです。 しかし、私は何とかそれを私のDataGridにバインドしたいです。どうやってやるの?グリッドは、生成する列をどのようにして知るのでしょうか?

答えて

0

グリッドのDataSource(またはDataContext)をObservable Collectionに設定します。

私はそのデータグリッドに慣れていませんが、ほとんどのグリッドにはObservable Collectionの型のすべてのパブリックプロパティを列として公開するか、XAMLで列レイアウトを明示的に設定するか、列定義は、列データに使用するオブジェクトのプロパティです。

Infragisticsデータグリッドを使用する

   <igDP:Field Name="OrderSize" Label="Order Size"> 
        <igDP:Field.Settings > 
         <igDP:FieldSettings CellWidth="75"> 
          <igDP:FieldSettings.EditorStyle> 
           <Style TargetType="{x:Type Editors:ValueEditor}" > 
            <Style.Setters> 
             <Setter Property="Format" Value="#,##0"/> 
            </Style.Setters> 
           </Style> 
          </igDP:FieldSettings.EditorStyle> 
         </igDP:FieldSettings> 
        </igDP:Field.Settings> 
       </igDP:Field> 

名前は、使用するオブジェクトのプロパティを設定する場所です。

0

あなたのグリッドは列を直接構築することも、希望の列の種類を指定することもできます。このvideoを見ると、それが説明されます。これはVS2010のためのものですが、VS2008の基本は同じですが、インプリメンテーションはそれほど統合されていないため、わずかに異なります。

バインド方法は、アイテムを保持するObservableCollectionをグリッドのItemsSourceプロパティに割り当てます。

3

私が収集するのは、サービスの結果をObservableCollectionに入れなければならないということです。汗はありません。しかし、私はどうにかしてそれを私のDataGridにバインドしたいです。どうやってやるの?

最も簡単な方法は、DataGridのItemsSourceプロパティをObservableCollectionに設定することです。

グリッドはどのように生成する列を知るでしょうか?

DataGridは、そのコレクション内のオブジェクトを反映し、見つかったパブリックプロパティごとに列を作成します。詳細は、hereを参照してください。

ItemsSourceプロパティを直接設定すると、実際にはwpfバインディングではありません。 WPFでデータバインディングを開始したときに役立つ3つのリンクがあります。

Bea Stollnitz: What does “{Binding}” mean?
WPF Basic Data Binding FAQ
MSDN: Data Binding How-to Topics

+0

ここには良い読書があるようです。今すぐチェックする時間はありませんが、私の後に戻ります。 –

2

のObservableCollectionは、あなたがそこから任意のbenifitをreciveません使用方法に応じて、このために使用することができますが。 ObservableCollectionの主な機能は、INotifyCollectionChangedを実装することです。このインターフェイスが行うことは、プロパティが変更されたことをUIに伝えるための通知メカニズムを提供します。ObservableCollectionは既にこれを実装しているので、DataGrid、ListBox、ItemsControlなどのItemSourceプロパティをこのタイプのコレクションにバインドすると、項目がAdded/Removed/Replaced/Moved/ResetになるたびにUIが自動的に更新されます。このため、新しいIEnumerable結果セットでコレクションを更新するたびに、コレクションをクリアしてから新しい結果を追加する必要があります。

しかし、このケースではObservableCollectionよりも推奨されるオプションがあります。これは、ObjectDataProviderと呼ばれるものを使用することです。これを使用すると、コードを完全に回避することができ、全体的にははるかにクリーンになります。だから我々はどこかに私たちのサービスを持って、あなたが記述サービス気に入りましWindow.xaml.cs

public class TranslationService 
{ 
    public IEnumerable<string> Translate(string s) 
    { 
     return s.ToCharArray().Select(c => c.ToString()); 
    } 
} 

で、この場合には、それがテキストボックスから文字列を受け取り、IEnumerableを返します。今、XAMLではこのサービスを使用して呼び出しを行うことができます。ウィンドウdeclerationsで

、我々はサービスが置かれている場所の名前空間を追加します。

xmlns:local="clr-namespace:WpfApplication4" 

今、私たちのWindow.Resourcesに(またはUserControl、またはどこか他の)私たちは私たちのサービスを参照することができます。サービスとしてリソースを公開したら、使用するTranslateメソッドを公開するObjectDataProviderを作成できます。

<Window.Resources> 
    <local:TranslationService x:Key="MyTranslationService" /> 
    <ObjectDataProvider x:Key="MyProvider" 
         ObjectInstance="{StaticResource MyTranslationService}" 
         MethodName="Translate"> 
     <ObjectDataProvider.MethodParameters> 
      "" 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

ObjectDataProviderはサービスに対してキーイングされ、Stringメソッドを使用してTranslateメソッドを呼び出します。これで、テキストボックスに応答するだけです。

Bindingプロパティの一部を使用してこれを行うことができます。 TextBoxのTextPropertyをObjectDataProviderにバインドして、Sourceプロパティを設定するようにします。 PathにバインドするObjectDataProviderの部分は、MethodParameterです。ここでは、そのプロパティのソースに直接バインドするように設定し、一方向にのみ移動します。つまり、ObjectDataProviderのメソッドパラメータはTextBoxのテキストを更新しません。最後に、UpdateSourceTriggerをPropertyChangedに設定して、テキストに変更があったときは常に、オブジェクトデータプロバイダ内のバインディング元のバインディングを設定するように指示できます。

<StackPanel> 
     <TextBox TextChanged="OnTextChanged" 
      Text="{Binding Source={StaticResource MyProvider}, Path=MethodParameters[0], BindsDirectlyToSource=True, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" /> 
     <ListBox ItemsSource="{Binding Source={StaticResource MyProvider}}" /> 
    </StackPanel> 

残っているのは、グリッド内のItemsSourceまたはこの場合は単純なListBoxを設定することです。

DataGridの最後の部分について: WPFToolkitのデータグリッドを使用している場合は、プロパティを使用して設定できる自動生成機能があります。詳細については、hereを参照してください。

+0

ありがとう、私は少しの変更でこの例を適用できると思う。私は自分のサービスを直接呼び出すつもりはないので、すべてのキーストロークが私のサービス(と私の翻訳データベース)への呼び出しを引き起こすのではなく、その間に小さなタイマーバッファを持っているようにしたい。しかしそれ以外は、それは約束しているように見えます。 –

関連する問題