2

非常に簡単な例を見てみましょう:

  • 私の window1.xaml には、「lblProduct」という名前のラベル コントロールがあります。
  • 私の window1.xaml.cs には、CalculateProduct(Int Var1, Int Var2) というパブリック メソッドがあります。CalculateProduct は、ご想像のとおり、渡された変数の積を計算します。

「CalculateProduct」の結果をラベルに単純にバインドしたいと思います。私の実際の使用例は、これよりも少し複雑です。しかし、これを起動して実行できれば、私は非常に満足するだけでなく、残りを理解することができます.

ObjectDataProvider を使用して新しいクラスの静的メソッドにバインドする興味深い例を見てきました。これは良いことですが、ウィンドウ用のクラスを既にインスタンス化している場合は、新しいクラスを作成する必要はありません。さらに、Window1 クラスで利用したいグローバル変数が他にもあるかもしれません。

お時間を割いていただき、ありがとうございました。

アベル。

4

5 に答える 5

3

それは迅速で汚いですが、おそらくCalculateProductにその結果を含むプロパティを設定させ、プロパティにデータバインドさせるだけです。

于 2008-11-10T21:26:54.180 に答える
2

はい、方法はあります。それはきれいではありません。window1.xaml タグに xmlns:Commands 属性を追加する必要があります。この Code Project の記事で見つけたいくつかのコードを粗末にしてしまいました。

ラベルに表示したい製品は、ロード時に生成されたものですか、それとも別のコントロール イベントから生成されたものですか?

これが役立つかどうかはわかりませんが、XSLT を使用して XAML を動的に生成しようとしていたときに、似たようなことに遭遇しました。私の解決策はうまくいきました。しかし、多分それはあなたを助けるでしょう。

先ほど言ったように、次のように、ページ タグで xmlns を宣言する必要があります。

<Page x:Class="WpfBrowserApplication1.Page1" 
  blah blah blah 
  xmlns:Commands="clr-namespace:WpfBrowserApplication1">

次に、RoutedUICommand のハンドラーを使用して、Code Project 記事の例とほぼ同じ名前空間を使用して、アプリケーションで静的クラスを定義します。

namespace WpfBrowserApplication1
{
    public static class CommandHandlers
    {
        private static System.Windows.Input.RoutedUICommand _submitCommand;

        static CommandHandlers()
        {
            _submitCommand = new System.Windows.Input.RoutedUICommand("Submit", "SubmitCommand", typeof(CommandHandlers));
        }

        public static void BindCommandsToPage(System.Windows.Controls.Page caller)
        {
            caller.CommandBindings.Add(new System.Windows.Input.CommandBinding(SubmitCommand, SubmitContact_Executed, SubmitContact_CanExecute));
        }

        public static System.Windows.Input.RoutedUICommand SubmitCommand
        {
            get { return _submitCommand; }
        }

        public static void SubmitContact_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
        {
            ...do stuff...
        }

        public static void SubmitContact_CanExecute(object sender, System.Windows.Input.CanExecuteRoutedEventArgs e)
        {
            if (e.Source is System.Windows.Controls.Button)
                e.CanExecute = true;
            else
                e.CanExecute = false;
        }
    }
}

厄介な部分は、私が見つけた限りでは、物事を Page1.xaml にマップする唯一の方法は、送信者オブジェクトをキャストし、ページの UI 要素を掘り下げることです。これは、DOM を掘り下げる方法と同様です。ウェブページで。私はこれである程度成功しましたが、確かに専門家のふりをしないでください。

最後に、Page1.xaml.cs でコントロールを接続します。XAML では、次のようにします。

<Button Name="btnSubmit" Command="Commands:CommandHandlers.SubmitCommand" etc... />

コード ビハインドでは、次のようになります。

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    CommandHandlers.BindCommandsToPage(this);
}

お役に立てば幸いです。幸運を祈ります。

于 2008-11-10T21:32:26.027 に答える
1

メソッドから戻る前に、CalculateProduct メソッドでラベル値を設定しないのはなぜですか。基本的に、ここでデータバインディングが必要ですか? ラベルにバインドしているので、とにかく一方向です。

于 2008-11-11T17:57:38.487 に答える
1

ObjectDataProviderWindow インスタンスを割り当てることがObjectInstanceできるプロパティがあります。

于 2008-11-10T20:57:05.003 に答える
0

aogan: ここでのアイデアは、WPF データバインディングの柔軟性を活用することです。コード ビハインドで UI 全体を設定することもできましたが、MS がこのバインディング システムを開発したので、それを簡単に利用したいと考えました。また、これはより複雑な問題の単純な例でした。

関係者全員に、私は PITAdev のソリューションを使用しました。助けてくれてありがとう。

于 2008-11-11T18:06:40.170 に答える