自定义组件
- UserControl:适用于粒度较大,需要自己的 ViewModel 的组件;
- Custom Control:适用于粒度小,无额外状态或状态较少的组件;
UserControl¶
- 形式上是 .xaml.cs + .xaml;
- 多个组件的组合,一般用于页面内容(或者用 Page);
- 一般有自己对应的 viewModel;
总的来说适用于粒度比较大,其中引用多个无状态组件,但是自己本身有状态(viewModel)的组件情况。
实现步骤:
- 创建 UserControl(.xaml.cs, .xaml 文件);
- 创建对应的 ViewModel;
- 在 ViewModel 中声明用于绑定的属性;
- 在 .xaml 中进行绑定;
如果情况比较简单,不使用 ViewModel,也可以在 .xaml.cs 中声明依赖属性,将 DataContext 设为控件自己。
使用依赖属性时,如果仅有一个“主属性”,其它属性都是由主属性计算得来,那么在声明依赖属性时,利用 PropertyMetadata 中的 onPropertyChanged 回调进行其它依赖于它的属性的计算即可。
Custom control¶
- 可以直接手动创建 .cs 文件,继承 System.Windows.Controls.Control(或者其它需要自定义的控件类型),样式写在单独的 .xaml 文件中;
-
声明组件的 Style,使用 TemplateBinding;
<Style TargetType="{x:Type local:MyCustomControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> <Border Padding="10" Background="LightGray"> <TextBlock Text="{TemplateBinding Title}" FontSize="16"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> -
在 App.xaml 中(或者所需控件中)添加相关控件所在的资源字典;
Bindings¶
在 Style#ControlTemplate 中:
<Style>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate ...>
<TextBlock Text="{Binding Path=P, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
...
或者 TemplateBinding
直接的属性
在 Style.Triggers 中
在 ControlTemplate.Triggers 中
<Condition Binding="{Binding Path=(controls:MultiSelectTreeViewItem.CanMultiSelect), RelativeSource={RelativeSource Mode=Self}}" Value="True" />