13

GUI を使用して SQL クエリを生成するツールを作成しました。MVVM と WPF を使用してツールを書き直したいと考えています。次の画像でわかるように、すべての SQL 列の種類には異なるコントロールがあります。

ここに画像の説明を入力

SQL 列タイプに基づいて列フィルター コントロールを追加し、Windows フォームで行っていたのと同じように、コードを使用してコントロールを生成します。

  1. MVVMでは、XAMLを使用してビューが完全に記述されていることを読みました.MVVMは、スタックパネルにさまざまなユーザーコントロールを動的に追加する必要があるアプリケーションをスイートにしますか?
  2. 一部の列がダブルクリックされない限り、コントロールはビューに存在しません。つまり、コントロールは xaml で使用できず、非表示または折りたたまれません。
  3. コードビハインドのバインディングを回避する方法はありますか?
  4. 列の種類ごとにユーザー コントロールを作成する必要がありますか?
  5. 一般に、mvvm を使用して複雑で動的な UI を使用してそのようなアプリケーションを開発するための最良のアプローチは何ですか?
4

4 に答える 4

15

私はそれを達成する方法を知っていると思いますが、それは非常に複雑なものです. まず、MVVM の基本概念を理解する必要があります。メイン ViewModel は ViewModel のクラスである必要がありObservableCollection、それぞれがデータとプロパティを持つ列を表します。

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

class ViewModelBase : IViewModel
{
    // ... MVVM basics, PropertyChanged etc. ...
}

class MainViewModel : ViewModelBase
{
    ObservableCollection<IColumnViewModel> Columns {get; set}
}

ビューでは、リスト項目のバインドに従ってWPFによって自動的に選択される、と埋め込む必要があるItemsControlwithのようなものを想定しています。それ自体はそれに適していませんが、次のように呼び出すことができますItemTemplateContentControlDataTemplateDataContextStackPanelItemsPanelTemplate

<Window
    xmlns:v="clr-namespace:WpfApplication.Views"
    xmlns:vm="clr-namespace:WpfApplication.ViewModels">
    <Window.Resources>
        <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}">
            <v:TextColumnView/>
        </DataTemplate>
    </Window.Resources>
    <ItemsControl
        ItemsSource="{Binding Columns}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

したがって、列の種類ごとに View/ViewModel のペアを作成する必要があります。

私の例が役立つことを願っています。あなたのガールフレンドとMVVMで頑張ってください:)

于 2013-09-02T19:08:34.560 に答える
3

あなたのシナリオを正しく理解している場合: データ テンプレートとアイテム テンプレートを使用できます。たとえば、データをコレクションにロードし、そのコレクションの各アイテムを定義に基づいてラップ パネル [またはスタック パネル] に表示するアプリケーションを作成しました。データ テンプレート。また、ラップ パネル アイテムは、双方向バインディング内でコレクション自体によって同期されます。この目標を達成するには、監視可能なコレクションを使用することを検討する必要があります。次に、コレクションを埋めて、ビューで結果を確認できます。これが役立つことを願っています。

于 2013-09-01T18:09:18.423 に答える
3

MVVM でこのようなものを記述するには、コンテンツ領域などの 1 つのビューが必要です。そのビューにはビュー モデルがあり、そのビュー モデルのプロパティの 1 つがビューになるか、そのビュー モデルのいくつかのプロパティがビューになります。頭を包むのに少し時間がかかる場合がありますが、制御の反転と依存性注入を適切に使用すると、ビューのビューは MVVM パターンで非常に扱いやすくなります。

于 2013-09-01T20:15:12.840 に答える
1

ビューはすべて XAML で記述されているわけではなく、C# でコントロールを生成します。

これを書き直して MVVM の型にはめ込むことで何かが得られるとは思いません。コードはそのままにしてお楽しみください。

于 2013-09-01T17:27:36.007 に答える