c# 脱毛およびMVVMユーザーコントロール




wpf user-controls (2)

おそらく私は誤解しましたが、コードの中でバインディングを使用しようとしているようですね。

public MyUserControl()
{
    InitializeComponent();

    // Set your datacontext.

    var binding = new Binding("SomeVMProperty");
    binding.Source = this.DataContext;

    SetBinding(MyDependencyProperty, binding);
}

私はMVVMのパターンを使用してC#とWPFで書かれたユーザコントロールを持っています。

私がしたいのは、バインドされたViewModel内のプロパティをコントロール外に公開することだけです。 私はそれにバインドできるようにしたい、私は、公開された値にバインドされているコントロールの外の何かによってピックアップされるプロパティの変更をしたい。

これはシンプルに聞こえるが、私の髪を引っ張るようになる。

私は、ユーザーコントロールに依存プロパティがあります。 ViewModelにはINotifyPropertyChangedインターフェイスを実装するプロパティがあり、PropertyChangedイベントを正しく呼び出しています。

いくつかの質問:1)どのようにViewModelプロパティの変更をピックアップし、MVVMの分離を破ることなくそれを依存関係プロパティに結びつけるのですか? 今まで私がこれをやってきた唯一の方法は、ViewModels PropertyChangedイベントをコントロールのコードの背後に割り当てることです。これは絶対にMVVMではありません。

2)上記のファッジを使用して、Dependencyプロパティを取得してPropertyChangedCallbackを開始することができますが、コントロールの外側にバインドされたものは変更を取得しません。

これをすべて行うには簡単な方法が必要です。 私はここにコードを掲載していないことに注意してください - 私は既存のコードで回答に影響を与えたくないと思っています。 とにかく、あなたはおそらくすべてそれを笑うでしょう...

ロブ

OK、明確にする - コード例:

ユーザーコントロールコードの背後:

   public static DependencyProperty NewRepositoryRunProperty = DependencyProperty.Register("NewRepositoryRun", typeof(int?), typeof(GroupTree),
                                                                new FrameworkPropertyMetadata( null, new PropertyChangedCallback(OnNewRepositoryRunChanged)));
    public int? NewRepositoryRun
    {
        get { return (int?)GetValue(NewRepositoryRunProperty); }
        set
        {
            SetValue(NewRepositoryRunProperty, value);
        }
    }

    private static void OnNewRepositoryRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (e.OldValue != e.NewValue)
        {

        }
    }

    public GroupTree()
    {
        InitializeComponent();

        GroupTreeVM vm = new GroupTreeVM();

        this.DataContext = vm;

    }

ViewModel(GroupTreeVM.cs)

   private int? _NewRepositoryRun;
    public int? NewRepositoryRun
    {
        get
        {
            return _NewRepositoryRun;
        }
        set
        {
            _NewRepositoryRun = value; 
            NotifyPropertyChanged();
        }
    }

Answer #1

そして今、私の毎週のために、 "それはしないでください"答え...

あなたのUserControl用のViewModelを作成することは、コードの匂いです。

あなたはこの匂いのためにこの問題を経験しています。それはあなたが何か間違っていることを示すはずです。

ソリューションは、UserControl用に構築されたVMを排除することです。 ビジネスロジックが含まれている場合は、別のViewModelの適​​切な場所に移動する必要があります。

UserControlはもっと複雑なコントロールであると考えるべきです。 TextBoxは独自のViewModelを持っていますか? いいえ、VMのプロパティをコントロールのTextプロパティにバインドします。コントロールはUIにテキストを表示します。

MVVMのUserControlsをこのように考えてみましょう。各モデルについて、UserControlがあり、そのモデルのデータをユーザーに提示するように設計されています。 そのモデルをユーザーに見せたい場所であればどこでも使用できます。 ボタンが必要ですか? UserControlのICommandプロパティを公開し、ビジネスロジックをバインドさせます。 ビジネスロジックは内部で何かを知る必要がありますか? ルーティングされたイベントを追加します。

通常、WPFでは、何かをすることが痛い理由を尋ねると、それをしてはならないからです。





user-controls