0

私のシナリオ: wpf フォームには textbox と wpf toolkig datagrid があります。テキストボックスにテキストが入力されると、私のサービスはIEnumerable<TranslationItem>項目を返します。データグリッドにこのサービスの結果を表示したい。

グーグルで調べてみましたが、頭も尻尾もわかりません。私は WPF を学び始めたばかりで、使用されている用語のほとんどがわかりません。
私が集めたのは、サービスの結果を ObservableCollection に入れる必要があるということです。しかし、どうにかしてデータグリッドにバインドしたいと思います。どうやってやるの?グリッドはどの列を生成するかをどのように認識しますか?

4

4 に答える 4

3

私が集めたのは、サービスの結果を ObservableCollection に入れる必要があるということです。しかし、どうにかしてデータグリッドにバインドしたいと思います。どうやってやるの?

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

グリッドはどの列を生成するかをどのように認識しますか?

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

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

Bea Stollnitz: 「{Binding}」とはどういう意味ですか?
WPF の基本的なデータ バインディングに関する FAQ
MSDN: データ バインディングのハウツー トピック

于 2009-05-19T16:26:36.630 に答える
2

これには ObservableCollection を使用できますが、使用方法によっては、何のメリットも得られません。ObservableCollection の重要な機能は、INotifyCollectionChanged を実装することです。このインターフェイスが行うことは、プロパティが変更されたことを UI に伝える通知メカニズムを提供することです。ObservableCollection は既にこれを実装しているため、DataGrid、ListBox、ItemsControl などの ItemSource プロパティをこのタイプのコレクションにバインドすると、アイテムが追加/削除/置換/移動/リセットされるたびに 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 でこのサービスを使用して呼び出すことができます。

ウィンドウの宣言では、サービスが配置されている場所の名前空間を追加します。

 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 は Service に関連付けられており、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>

あとは、Grid に ItemsSource を設定するか、この場合は単純な ListBox を設定するだけです。

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

于 2009-05-20T07:27:36.950 に答える
0

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

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

たとえば、Infragistics Data Grid を使用

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

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

于 2009-05-19T15:22:49.760 に答える
0

グリッドは列を直接構築するか、必要な列タイプを指定できます。このビデオを見ると、それが説明されます。これは VS2010 用ですが、基本は VS2008 と同じですが、統合されていないため、実装はわずかに異なります。

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

于 2009-05-19T15:24:21.583 に答える