0

私は過去2週間からこのwpfに夢中です。私は現在、MVVMパターンに基づいたwpfアプリケーションを開発しています。Visual C#2010のソリューション内に2つのプロジェクトがあります。1つはWPFアプリケーション(たとえばMSPBoardControl)で、もう1つはクラスライブラリ(たとえばConnectViewComponent)です。したがって、MSPBoardControlとConnectViewComponentの両方に、それぞれview、viewmodel、modelクラスがあります。

MSPBoardControlにConnectViewComponentの参照を追加し、MSPBoardControlのView、Viewmodel、およびmodelクラスのConnectViewComponentのメンバー変数にアクセスできるようになりました。私の懸念は、ConnectViewComponentからMSPBoardControlのメンバー変数にアクセスする方法です。

MSPBoardControlのViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using ConnectViewComponent.Model;
using System.Windows.Input;
using ConnectViewComponent.Commands;
[[[using MSPBoardControl.ViewModel;]]]

namespace ConnectViewComponent.ViewModel
{
public class ConnectViewModel : INotifyPropertyChanged
{
    public List<ConnectModel> m_BoardNames;
    [[[BoardControlViewModel mBoardVM;]]]

    public ConnectViewModel()
    {
        m_BoardNames = new List<ConnectModel>()
        {                
            new ConnectModel() {Name = "Bavaria", Connection_Status = "Disconnected"},
            new ConnectModel() {Name = "Redhook", Connection_Status = "Disconnected"},                
        };
    }

    public List<ConnectModel> BoardNames
    {
        //get set
    }

    private ConnectModel m_SelectedBoardItem;
    public ConnectModel SelectedBoard
    {
        //get set
    }

    private ICommand mUpdater;
    public ICommand ConnectCommand
    {
        get
        {
            if (mUpdater == null)
                mUpdater = new DelegateCommand(new Action(SaveExecuted), new Func<bool>(SaveCanExecute));

            return mUpdater;
        }
        set
        {
            mUpdater = value;
        }
    }

    public bool SaveCanExecute()
    {
        return true;
    }

    public void SaveExecuted()
    {
        if (SelectedBoard.Connection_Status == "Disconnected" && SelectedBoard.Name == "Bavaria")
        {
            SelectedBoard.Connection_Status = "Connected";                
        }

        else if (SelectedBoard.Connection_Status == "Disconnected" && SelectedBoard.Name == "Redhook")
        {
            SelectedBoard.Connection_Status = "Connected";               
        }
    }
}
}

私のコードの[[[-]]]は、BoardControlViewModelのメンバーにアクセスできず、Namespace.ViewModelも使用できないことを示しています。

循環依存につながるため、ConnectComponentプロジェクトにBoardControlの参照を追加できません。どうすればアクセスできますか?助けてください!!

4

2 に答える 2

2

プロジェクトに循環依存関係があると、「コードの臭い」になる可能性があります。この「におい」を取り除くにはさまざまな方法があります。簡単にするために、循環依存関係を持つプロジェクトAとプロジェクトBがあるとします。

  1. 両方のプロジェクトで使用される共通のタイプを除外し、それらを新しいプロジェクトCに移動します。AとBにCを参照させます。これにより、AからBへの依存関係、または反対の依存関係、あるいは両方の依存関係が削除されます。

  2. AとBに相互作用する必要のある型がある場合は、この相互作用を共通の抽象化セット(インターフェースや抽象基本クラスなど)に分離する必要があります。次に、これらのタイプを実装せずに、AとBの両方が参照するプロジェクトCに移動する必要があります。これにより、AとBの型が相互作用できるようになりますが、Cの定義のみが使用されます。例として、Aがメインアプリケーションである場合があります。IServiceCで定義されているが、Bで実装されているインターフェイスを呼び出し、IServiceCallbackを介してCで定義されたコールバックを登録しますIServiceIServiceCallbackその後、Bは、実装がAにあることを知らなくても、を使用してAにコールバックできます。

  3. AとBのタイプが強く結合されている場合は、AとBを1つのプロジェクトにマージする必要があります。

于 2012-09-22T12:40:09.993 に答える
1

これらの一般的なクラスを含む、ある種の「共通」ライブラリ (プロジェクト) を追加できます。したがって、BoardControl と ConnectComponent の両方が参照できます。

同様の質問も確認できます。

于 2012-09-22T12:23:40.600 に答える