Skip to content

自定义组件

  • UserControl:适用于粒度较大,需要自己的 ViewModel 的组件;
  • Custom Control:适用于粒度小,无额外状态或状态较少的组件;

UserControl

  • 形式上是 .xaml.cs + .xaml;
  • 多个组件的组合,一般用于页面内容(或者用 Page);
  • 一般有自己对应的 viewModel;

总的来说适用于粒度比较大,其中引用多个无状态组件,但是自己本身有状态(viewModel)的组件情况。

实现步骤:

  1. 创建 UserControl(.xaml.cs, .xaml 文件);
  2. 创建对应的 ViewModel;
  3. 在 ViewModel 中声明用于绑定的属性;
  4. 在 .xaml 中进行绑定;

如果情况比较简单,不使用 ViewModel,也可以在 .xaml.cs 中声明依赖属性,将 DataContext 设为控件自己。

使用依赖属性时,如果仅有一个“主属性”,其它属性都是由主属性计算得来,那么在声明依赖属性时,利用 PropertyMetadata 中的 onPropertyChanged 回调进行其它依赖于它的属性的计算即可。

Custom control

  1. 可以直接手动创建 .cs 文件,继承 System.Windows.Controls.Control(或者其它需要自定义的控件类型),样式写在单独的 .xaml 文件中;
  2. 声明组件的 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>
    

  3. 在 App.xaml 中(或者所需控件中)添加相关控件所在的资源字典;

Bindings

Style#ControlTemplate 中:

<Style>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate ...>
                <TextBlock Text="{Binding Path=P, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
                ...

或者 TemplateBinding

直接的属性

<Style>
    <Setter Property="Prop" Value="{Binding IsXxx}"/>
    ...

Style.Triggers

ControlTemplate.Triggers

<Condition Binding="{Binding Path=(controls:MultiSelectTreeViewItem.CanMultiSelect), RelativeSource={RelativeSource Mode=Self}}" Value="True" />