カスタムコントロールでのコマンドの使用

検索テキストボックスを使用しようとしています(このチュートリアルでは、 http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/ )。

I use MVVM & WPF. The above user control works when you write the "Search"-event in the code-behind file of the View, but I can't get it to work with a command (using the ViewModel).

(検索イベントは約2秒間何も入力しなかった場合に起動します。)

Caliburnを使ってみましたので、viewイベントをviewmodelメソッドに "マップ"できます。ただし、イベントが発生すると、アプリケーションがクラッシュします。「メソッドSearchText()に対してターゲットが見つかりません」カスタムユーザーコントロールのRaiseSearchEventメソッドを使用します。

See the following test application: Test application

誰かが私が間違っていることを教えてもらえますか?私はCaliBurnに次のことを告げる:


        
            
        

だから私はこれが正しいことを確かめる。つまり、「検索」イベントが発生すると、caliburnはViewModelのSearchTextメソッドを探します。これは起こることはありませんが、それは私のアプリをクラッシュさせて焼き尽くします。

なぜなのかご存知ですか?または、私がこの問題をどのように解決できるか(キャリバーンと一緒にいる必要はありません)。 私はすでに "拡張コマンドサポート"( http://msdn.microsoft.com /en-us/library/dd458928.aspx )、これは私にとっては少し複雑すぎる:/

助けてくれてありがとう!

1

3 答え

CaliburnのActionMessageを使用していますが、Bootstrapperクラスを使用してアプリケーションを起動しないため、MainViewのDataContextはMainViewModelのインスタンスに設定されていません。実行時にSearchTextBoxのDataContextをチェックすると、nullであることがわかります。

ここでは、問題を解決するための一連の手順を示します(リンクされたサンプルプロジェクトを使用)

MyBootstrapperというクラスを作成します。それはこのように見えるはずです

public class MyBootstrapper : Bootstrapper {}

新しいブートストラップをアプリケーションのリソースコレクションに追加します(下に示すように(App.xaml)


    
        
            
                
                    
                
            
        
    

理由はわかりませんが、ブートストラップが自分のビルドにネストされていないと、App.InitializeComponent()が実行されたときにインスタンス化されることはありません。

App.xaml.csを単にInitializeComponentを実行するように変更します。これを動作させるためにビルドをちょっと微調整しなければならないことに注意してください... InitializeComponent()は、ステップ2のネストされたリソース辞書がある場合、またはx: App.xamlの名前属性、またはおそらく他のもの...

using System.Windows;

namespace WpfApplicationParadise
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }
    }
}

最後に、Wallstreet Programmerが提案したとおり、括弧を削除する必要があります

これらの手順を実行すると、アプリケーションがブートストラップをインスタンス化し、アプリケーションのルートビューモデルとしてMainViewModelをインスタンス化し、MainViewを作成してDataViewextをMainViewModelに接続する必要があります。その時点で、アプリケーションは期待どおりに動作するはずです。

1
追加された
エイドリアンありがとう!それは私が本当に解決策を見つけ出す時間を割いていただきありがとうございます。私の間違いは、ブートストラッパーが私のapp.xamlがやっていなかったこと以外は何もしなかったことを想定していたことです(私が間違っているところを見てください)。これはスタートアップウィンドウを設定しています。 CaliBurnは本当に便利なツールのように見えるので、私はこれを覚えています:)
追加された 著者 Team-JoKi,
いいえ、どいたしまして。 Caliburn.Microは素晴らしいです。
追加された 著者 Adrian,

削除()


0
追加された
レスポンスありがとう!残念ながら私はすでにそれを試みましたが、それは私にとって問題を解決しません。このサンプルを実行しようとしましたか?
追加された 著者 Team-JoKi,

アプリケーションを実行すると、MainViewModelを初期化し、SearchTextBoxのTextをTekstBoxTekstでバインドする必要があることがわかります。

コードビハインド

public partial class MainView : Window
{
    public MainView()
    {
        InitializeComponent();
        this.Loaded += (s, e) =>
                        {
                            this.DataContext = new MainViewModel();
                        };
    }
}

XAML


    
        
            
                
                
            
        
    

0
追加された
devdigitalが正しいです、Caliburnはすべてのものを世話します。しかし、興味がありがとう:)
追加された 著者 Team-JoKi,
あなたは謝罪する必要はありません:/あなたが試みたことに感謝しています
追加された 著者 Team-JoKi,
Caliburn.Microを使用する場合は、コードビハインドでビューのデータコンテキストを明示的に設定しないでください。また、慣習を使用する場合は、明示的なバインディングも必要ありません。
追加された 著者 devdigital,
@ Team-JoKi:ああ、私はCaliburnを知らず、一般的なWPFのように思っていましたが、私のコードがうまくいくので、この点はデータの設定とテキストのバインディングという2つのことを教えてくれます。邪魔してごめんなさい。
追加された 著者 Jin-Wook Chung,