3

bindingタイプ " " のオブジェクトへのバインドが完了したときに、WPF にターゲット タイプを定義できる機能があるかどうかを尋ねたかったのobjectです。タイプ " " のジェネリック コレクションがあります。これは、さまざまなバインディング ポイントでobjectいずれかのオブジェクト タイプ (つまり 、 など) として処理する必要がありますDateTimeint

Type_Xバインディングを処理するときに、ケースバイケースで、コンパイル時に不明なタイプのオブジェクトを のオブジェクトとして扱うように .Net フレームワークに任意に強制する方法はありますか?

4

4 に答える 4

6

もちろん、使用できますDataTemplates。App.xaml で定義すると、グローバルに適用されます。

<DataTemplate DataType="{x:Type local:YourType}">
    <TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/>
</DataTemplate>

YourTypeのように UI のどこかにランタイム タイプのオブジェクトを追加するStackPanelと、そのテンプレートが使用されます。

于 2012-06-22T08:34:50.597 に答える
2

d:DataContext でデザイン時の DataContext を設定できるかもしれません - IDE に期待するデータの種類だけを知らせたい場合。

<ContextMenu ItemsSource="{Binding Shapes}"
             DataContext="{Binding Data, Source={StaticResource BindingProxy}}"
             d:DataContext="{d:DesignInstance tree:DesktopViewModel}">
    [items...]
</ContextMenu>

BindingProxy (オブジェクト型の Data-Property を持つ) から DataContext を取得する ContextMenu があります。VS と Resharper が正しく動作するためには、DataContext の型を知っている必要があるため、単純に設計時の DataContext を定義すると、それがDesktopViewModel.

これは DataContext でのみ機能し、バインディングでは機能しませんが (DesignTimeBinding などがないため)、その DataContext を参照するようにバインディングを書き換えることができます (または、DataContext と d:DataContext を持つグリッドでコントロールをラップします)。 .

于 2014-12-08T12:33:09.847 に答える
2

いいえ、Bindingクラスはそのような機能を提供しません。実際には必要ありません。バインド フレームワークは、ソース オブジェクトを関連する型に自動的に変換し、バインドされたプロパティ値を使用するか、そのプロパティが見つからない場合はバインド エラーを発生させます。

したがって、Objectタイプのプロパティがある場合ViewModel

public object Dummy 
{ 
    get 
    { 
        return dummy; 
    } 
    set 
    { 
        dummy = value;
        NotifyPropertyChanged("Dummy");
    } 
} 

そして、私はそれをこのようにバインドしましたTextBox-

<TextBox Text="{Binding Dummy.Name}" HorizontalAlignment="Stretch"/>

後でダミーを次のようなオブジェクトに設定します-

Dummy = new MyCustomType();

Nameこの時点で、バインディングは評価され、ソース オブジェクト内のプロパティを見つけようとします ( Dummy) MyCustomType。名前付きのパブリック プロパティが定義されている場合Name、バインディングが実行されます。それ以外の場合は、バインディング エラーが発生します (例外ではなく、出力ウィンドウにエラー メッセージが表示されます)。

ここで、自分のプロパティを 2 つの異なるタイプ (1 つは を持ち、もう1 つは を持っている) のDummyオブジェクトに設定したい場合は、2 つのオプションがあります。NameFirstName

  1. DataTemplatesBotz300 が提案するように定義する
  2. a を使用しますValueConverter(オブジェクト タイプをチェックし、関連するプロパティ値を返します)。

もう 1 つの使用法ValueConverterは、to do 変換を定義し、TypeConverterそれを で宣言すると、TypeConverterAttributeバインディングで自動変換が行われます。

オブジェクトのコレクションにも同じことが当てはまります。

アップデート:

はい、WPF は暗黙的にDefaultTypeコンバーターを使用して、型を関連する表示値に変換します。Objectをプロパティに直接バインドする場合(Text上記の例)、WPF はTypeConverterその型 (利用可能な場合) に を使用するか、ToString()メソッドを使用して表示値を取得します。

ただし、これはすべて、データの表示に使用しているコントロールと、バインドする方法/対象によって異なります。

注: このトリックは、単純なテキスト表現を持つことができるオブジェクトに対してのみ十分です。複雑なデータ オブジェクトを扱う場合、この便利な手法を使用しても意味がない場合があります。

これについて話しているMSDNのこの記事を読むことができます - データバインディングとWPFでデータ表示をカスタマイズする

于 2012-06-22T11:01:38.287 に答える