1

ViewModel クラスで、という名前の静的プロパティを定義しました

static member GetColumnTypes = FSharpType.GetUnionCases typeof<ColumnType>

ここで、ColumnType は通常のユニオン型です

type ColumnType   = T_Link of TableName | T_Real | T_Bool | T_Int | T_String

次のシナリオでそのようなコレクションにバインドする XAML でのロジックがわかりません。

<UserControl.Resources>
  <ObjectDataProvider x:Key="typelist" MethodName="GetColumnTypes" ObjectType="{x:Type local:MarkupViewModel}"/>
  <local:MarkupViewModel x:Key="defaultVM" d:IsDataSource="True"/>
</UserControl.Resources>

  //1-WORKS
  <ComboBox ItemsSource="{Binding Source={StaticResource defaultVM}, Path=GetColumnTypes}"></ComboBox> 

  //2-DOES NOT WORK
  <ComboBox ItemsSource="{Binding Source={StaticResource typelist}}"></ComboBox>

  //3-DOES NOT WORK
  <ComboBox ItemsSource="{Binding Source={x:Type local:MarkupViewModel}, Path=GetColumnTypes}"></ComboBox>

  //4-WORKS
  <ComboBox ItemsSource="{Binding  Path=GetColumnTypes}" />
  1. なぜこれが機能するのですか?名前付きの静的リソースdefaultVMは、パラメーターなしのコンストラクターを使用してオブジェクトを作成していました。このオブジェクトには、GetColumnTypes メソッドはありません。
  2. なぜ機能しないのですか?GetColumnTypes指定されたタイプを呼び出していると思いました。Enum値を取得する例を見ると、それが起こっているようです。私の場合は、パラメーターがないため、より単純です
  3. 繰り返しますが、これは言及された型のメソッドを呼び出しませんか?
  4. ここで、datacontext を Viremodel のインスタンスに設定すると、インスタンスから静的メソッドに移動するホストが「魔法のように」認識されます。

これらの質問に加えて、それは非常にブラックボックスの魔法のように感じ、バインディングプロセスに関する情報はほとんどありません.

それを明確にするための最良のアプローチは何ですか?
Binding プロセスで使用できるデバッグ ツールはありますか?

4

1 に答える 1

3

問題を解決するために知っておくべきことが 2 つあります。

まず、XAML では、型のインスタンスを介して静的メンバーにアクセスできます。たとえば、次のコードを使用して、VB.NET でもこれを行うことができます。

Dim x = New MarkupViewModel()
x.GetColumnTypes
MarkupViewModel.GetColumnTypes

最後の 2 行は同等です。実際、コンパイラは最初の行を 2 行目に書き換えます。XAML も同じ方法です。インスタンスがある場合は、インスタンス メンバーと同じ構文で静的メンバーにアクセスできます。(C# や F# などの他の言語では、この構文は使用できません)。

次に、メソッドObjectDataProviderを呼び出しますが、プロパティです。あなたがそれを私が期待するように定義していれば、それはうまくいくと思います。GetColumnTypesstatic member GetColumnTypes() = ...

ただし、これらのアプローチはどれも本当に理想的ではありません。やりたいことは、x:Staticマークアップ拡張機能を使用することです。これが設計されたものです。

名前空間の定義 (XAML ファイルの一番上のタグ) で、次のように記述します。

<UserControl [...] xmlns:local="clr-namespace:Your.Namespace">

次に、コンボ ボックスでその項目を次のように宣言します。

<ComboBox ItemsSource="{x:Static local:MarkupViewModel.GetColumnTypes}">

(ただし、関数ではなくプロパティとして保持している場合は、もちろん名前をColumnTypesnotに変更する必要がありますGetColumnTypes

Visual Studio Options > Debugging > Output Window > WPF Trace Settingsああ、バインディング エラーの診断に関しては、出力ウィンドウに多くの情報をダンプできる を介して、非常に多くのデバッグ情報を利用できます。ただし、WPF をよく知らないと、解釈がやや難しい場合があります。優れた汎用 WPF ユーティリティはSnoopです。これは、他の多くの理由で優れていますが、バインディング エラー情報も表示できます。

于 2013-03-28T04:12:25.417 に答える