私たちは、多くの場合、プロパティは、このプロパティの結合様式を決定する直接再利用する必要があるかどうかを、いくつかの再利用可能なコントロールを抽出します。
1、完全に非再使用可能なコントロール
いくつかのビジネス関連のコントロールと完全にViewModelに、比較的より複雑なコントロール、簡単にこのようからの強い、そのプロパティがあります。例えば:
// ChooseUc.xaml
<UserControl>
<StackPanel Orientation="Horizontal">
<Label Content="选择一个水果: "/>
<ComboBox ItemsSource="{Binding Fruits}"/>
</StackPanel>
</UserControl>
直接使用する場合<my:ChooseUc />
のViewModelの内部に直接結合してList<Fruit> Fruits
、余分な作業をしません。利点は特に便利で、価格は完全にVMに連結されています。
2、完全に再利用可能なコントロール
同様のコントロールとよりは、いくつかの完全に再利用可能なコントロールを取ることができるようになります、これらのコントロールは、ビジネスとは何の関係もありません。この再利用を実現するために、行うには:
- 内部統制で定義されているすべての変数の属性のうち、
- これらのプロパティは、バインドされたコントロールで定義されています
- 外部で使用する場合、その後、これらのプロパティとVMのバインド
次のとおりです。
// ChooseUc.xaml
<UserControl>
<StackPanel x:Name="root" Orientation="Horizontal">
<Label Content="{Binding Header}"/>
<ComboBox ItemsSource="{Binding Items}"/>
</StackPanel>
</UserControl>
CS対応するコード:
// ChooseUc.xaml.cs
public ChooseUc() {
InitializeComponent();
root.DataContext = this; // 这句很关键!
}
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(IEnumerable), typeof(ChooseUc));
public IEnumerable Items {
get { return (IEnumerable)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
//HeaderProperty类似,此处省略
場合は、次のように使用:
<my:ChooseUc Header="{Binding FruitHeader}" Items="{Binding Fruits}" />
特別な注意はroot.DataContext = this;
、この1外の世界から内部統制、実際には、ビューモデルの内部を見ることができませんでした、だけで内部的に定義されたプロパティ(ヘッダー、アイテムなど)を参照してください。任意のシーンいくつかの問題が、利点は、ラベル1のドロップダウンボックス、高い再利用性にも適用することができます。
欠点は、ただの悪夢であるカスタムコントロールカスケード、で、それです。想像3ユーザーコントロール:C> B> A(C Bを含む、BはAを含みます)。対応するC VM、Aのすべての属性を含めるには、この場合にはBのみ 実際には、これは腹立たしいです、すべての子コントロールのすべてのプロパティが含まれるように、Bです!
幸いなことに、ほとんどの場合、我々は、カスケード、ネストされたカスタムコントロールを必要としませんが、我々はまた、デフォルトのバインディングVMの取得を容易にするために、いくつかの再利用性をあきらめることができます。
3、再利用可能なコントロールの一部
ユーザは、2つの果物を選択することができ、その後:例別のタイプのシナリオを検討し、再利用可能なコントロールの一部であるFruits
VMの年に直接接続することができますが、SelectedFruit
それぞれに結合する必要があります。
// ChooseUc.xaml
<UserControl x:Name="uc">
<StackPanel Orientation="Horizontal">
<Label Content="选择一个水果: "/>
<ComboBox ItemsSource="{Binding Fruits}" SelectedItem="{Binding SelectedFruit, ElementName=uc}"/>
</StackPanel>
</UserControl>
// 类似的,ChooseUc.xaml.cs里定义SelectedFruit依赖属性
場合は、次のように使用:
<StackPanel>
<my:ChooseUc SelectedFruit="{Binding Fruit1}" />
<my:ChooseUc SelectedFruit="{Binding Fruit2}" />
</StackPanel>
この場合、でもカスケードでは、Fruits
定義を繰り返す必要が与えられなかったSelectedFruit
柔軟性を。ここで重要なのは、次のとおりです。他のプロパティの継承のVMのような内部統制にバインドされたプロパティを、再利用するのみ必要。
4.まとめ
ほとんどの場合、実際の開発プロセスは、再利用可能なコントロールの完全再利用一部である1 + 3、+です。でも、顔を完全再利用可能なコントロールではなく、総会でカスケードを形成します。