5

真のMVVMモデルでは、xaml.csにコードが遅れていることは想定されていません。また、viewModelにビューの参照があることも想定されていません。ただし、すべてのサードパーティのコントロールがTrueMVVMを適切にサポートしているわけではありません。

私の場合、Infragistics xamDatagridコントロールを使用しており、そのデータをExcelにエクスポートしたいと思います。データをExcelのデータグリッドにエクスポートする唯一の方法は、次のコードを使用することです。

xamDataGridExcelExporter.xamDataGridExcelExporter xamDataGridExcelExporter1 =       
   new xamDataGridExcelExporter.xamDataGridExcelExporter();   
xamDataGridExcelExporter1.Export(**this.xamDataGrid1**,   
   @"C:\Excel\ExportFile.xls");

ただし、XamDataGridExcelExporterはthis.xamDataGridとして入力を受け取ります。xamDataGridは、viewModelではなくViewの一部です。 では、viewModelでビューのインスタンスが必要なこのようなケースをどのように処理できるでしょうか

4

6 に答える 6

9

MVVMがコードビハインドを禁止しているというのはよくある誤解です。真実は、コードビハインドは再利用できず、ビューから分離できないため、自動化なしで単体テストを行うことはできません。しかし、それはその用途があります。

コードビハインドについて本質的に悪いことは何もありません。実際、コンバーターやカスタムコントロールなど、ビューをサポートするために作成する他のすべてのコードと大差ありません。このコードはいずれも、ビューモデルの単体テストではテストできません。コードビハインドとの唯一の違いは、再利用性が低いことです。しかし、それはまだあなたの見解の一部であり、見解は悪くありません。

一般に、コードビハインドがないことは、ビューとビューモデルが明確に分離されていることを示す良い指標です。ただし、他の点ではクリーンなデザインにコードビハインドが存在することは、通常、標準のコントロールとデータバインディングおよびコマンドでは実行が難しいことを示しているにすぎません。

あなたの場合、エクスポートXamDataGrid は間違いなくビュー固有です。ビューに選択したサードパーティのライブラリと正確に関係している必要があります。したがって、ビューモデルの一部であってはならないことは完全に理にかなっています。

それでもコードビハインドに対して完全に設定されていない場合は、 ACBBlend Behaviorsなどのビヘイビアーを使用して、コードビハインドに組み込む機能を記述できます。ビヘイビアーでさえビューの一部であり、コードビハインドよりも再利用しやすいことを理解してください。

于 2011-06-29T05:09:59.810 に答える
3

filenameと呼ばれる依存関係プロパティを持つxamDataGridのラッパーを作成できます。その後、ビューモデルはこのプロパティにバインドできます。xamDataGridは、filenameプロパティの変更を検出すると、提案したコードを実行できます。その後、さらに通知するためにfilenameプロパティをリセットします。

このソリューションは、コードビハインドからコードを排除し、xamDataGridにデータのエクスポートを任せます。

- - - -編集 - - - - -

2番目のソリューションは、MVVMライトメッセンジャークラスを利用できます。依存関係プロパティを宣言する代わりに、ラッパーにメッセージをリッスンさせます。ビューモデルがメッセージを送信すると(たとえば、パラメーターとしてファイル名を含めることができます)、ラッパーはコードを実行できます。

例えば

public class ExportableXamDataGrid: XamDataGrid
{
    public ExportableXamDataGrid():base()
    {
        Messenger.Default.Register<string>(this,"ExportExcel",ExportFile);
    }

    private void ExportFile(string file)
    {
        xamDataGridExcelExporter.xamDataGridExcelExporter xamDataGridExcelExporter1 =       
        new xamDataGridExcelExporter.xamDataGridExcelExporter();   
        xamDataGridExcelExporter1.Export(**this.xamDataGrid1**,   
           @"C:\Excel\ExportFile.xls");

    }
}

次に、ビューモデルで次のことができます。

 Messenger.Default.Send(@"C:\Excel\ExportFile.xls","ExportExcel");

問題には多くの解決策がありますが、そのすべてをビューでロジックの記述を開始する必要はありません。

http://www.lucbos.net/2011/06/using-codebehind-in-mvvm.html

于 2011-06-29T05:12:01.687 に答える
2

'問題'はビューが原因であるため、コードビハインドを使用します。

はい、それはMVVMを壊しますが、これらのコントロールを使用すると、すでに壊れています。背後のコードにソリューションを保持することで、ViewModelを可能な限りクリーンに保つことができるため、コントロールがMVVMをサポートしている場合は、クリーンアップが容易になります。

于 2011-06-29T04:43:14.637 に答える
1

XAMLでSystem.Windows.Interactivity.Interaction.Triggersを使用し、Eventトリガーを使用してXamDataGridのイベントを呼び出し、ViewModelで作成するカスタムメソッドを呼び出す「CallDataMethod」を使用することを強くお勧めします。これで最も良いのは、送信者としてobject(XamDataGrid)参照を取得することです。

これは純粋にMVVMであり、目標を達成することができます。また、XamDataGridと比較して非常に軽量なWPFDataGridを使用することをお勧めします。このコントロールによって提供されるいくつかの主要な機能を使用している場合にのみXamDataGridを使用してください。このUI要素を初期化するためだけに、プロセッサは200ミリ秒以上かかる場合があります。

<i:Interaction.Triggers>
                                <i:EventTrigger EventName="SelectedCellsChanged">
                                    <is:CallDataMethod Method="YourMethodNameInViewModel" />
                                </i:EventTrigger>
</i:Interaction.Triggers>

そして、ビューモデルであなたのメソッド、すなわち

public void YourMethodNameInViewModel(Object sender, EventArgs e)
    {}
于 2011-06-29T05:21:21.407 に答える
0

あまり気にしないでください。はい、「重い」ビューを持つことは、MVVMのアイデア(薄いビュー、テスト容易性)とは反対です。ただし、規則には常に例外があります。

ここでの決定は、「無料/既存の」XAMDataGridエクスポート機能を使用するか、独自のMVVMバージョン(ViewModelに存在する)を作成することです。

Option1を選択した場合は、View.DataContext = ViewModelを設定し、残りを処理するためにデータバインディングに依存する通常のアプローチに加えて、ViewModel内にViewオブジェクトをキャッシュする必要があります(ctorインジェクションを使用)。

于 2011-06-29T05:32:14.083 に答える
0

ExcelエクスポーターをViewModelに保持する代わりに、エクスポートをトリガーするイベントの周囲のビヘイビアーに配置することができます。

動作にDataPresenter(xamdatagrid)タイプの依存関係プロパティを作成し、それをXAMLcodeの既存のxamdatagridにバインドして、xamdatagridにアクセスできるようにします。このようにして機能的に実現し、ViewModelにはUIオブジェクトがなくなります。

<i:Interaction.Behaviors>
        <behav:ExcelExporterBehavior MyDataPresenter="{Binding ElementName=myxamdatagrid,Mode=OneTime}"></behav:ExcelExporterBehavior>
</i:Interaction.Behaviors>

MyDataPresenterがExcelExporterBehavior動作のプロパティであり他のUIコントロール(エクスポートするボタンなど)に設定されている場合。

于 2016-01-21T19:21:21.897 に答える