用户控件是否可以由XAML中的不同视图模型绑定和设置?

时间:2014-12-16 05:13:34

标签: wpf xaml user-controls custom-controls

不知道是否可以这样做 - 或者在哪里看(所以我在这里:))。

我有一个userControl,EditorView,它在XAML中实现,如:

<v:EditorView   Grid.Row="3"
   DataContext="{Binding Editor}"
   FontSize="100" 
   FontWeight="Bold" />

现在,用户控件EditorView通过以下方式接收这些值:

 <SimpleTextBlock 
   Background="#FFE24848"
   FontSize="{Binding     FontSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
   FontWeight="{Binding FontWeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"   
   />

一旦进入自定义控件SimpleTextBlock,我希望customcontrol将其FontSize,FontWeight等的值发送到usercontrol的viewmodel,以便在某些计算中使用。 (我可能会补充一点,我需要XAML实现后自定义控件中的值来获取它创建的实际值)。

所以问题是:

  1. 可以,怎么做?
  2. 如何在实例化UserControl后执行计算?
  3. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于SimpleTextBlock是一个自定义控件,只需向其添加一个或两个额外的依赖项属性,称为DataBoundFontSize和DataBoundFontWeight。然后重写OnApplyTemplate,在其上执行FontSize和FontWeight的值应该已经设置并将它们的值设置为DataBoundFontSize和DataBoundFontWeight。为了安全起见,如果FontSize和FontWeight稍后更改,您还应该订阅这些属性中的更改并保持其他属性的同步。

最后,将绑定应用于您的视图模型:

<SimpleTextBlock 
   Background="#FFE24848"
   FontSize="{Binding     FontSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
   FontWeight="{Binding FontWeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"   
   DataBoundFontSize="{Binding Path=FontSizeOnViewModel}"
   DataBoundFontWeight="{Binding Path=FontWeightOnViewModel}"
   />

如果这不是自定义控件,我会创建一个自定义操作/行为来监视您感兴趣的属性,然后通过使用依赖项属性的数据绑定将值发送到视图模型。

现在,出于好奇,我相信FontSize和FontWeight会自动继承到可视化树中包含的控件,所以您是否尝试查看FontSize和FontWeight是否继承到您的自定义控件而没有绑定?如果是这种情况那么你就不需要所有这些复杂性,你可以从那里绑定到视图模型。