我不能再进一步了。
我的结构如下所示:
ViewModel (Class)
Property Number (Class, iValue)
Value, InputValidationInfo, etc.
Property Icon (Class, iValue)
Value, InputValidationInfo, etc.
页面的 DataContext 是 ViewModel。页面上有输入字段。这些被分配给 iValue 之一(数字、图标)。所有输入字段都有一个 ContentTemplate。ContentTemplate 包含一些与 iValue 类的属性绑定的元素。
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" Background="{TemplateBinding Background}">
<DockPanel>
<Border Width="10" Background="{Binding InputValidation, Converter={StaticResource InputValidationToBrushConverter}}" Margin="0">
<Border.ToolTip>
<ToolTip Visibility="{Binding InputValidationInfoCount, Converter={StaticResource CountToVisibleConverter}}" >
<ItemsControl ItemsSource="{Binding InputValidationInfo}"/>
</ToolTip>
</Border.ToolTip>
</Border>
<Border x:Name="ContentBorder" Margin="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter Margin="5 1 0 1" x:Name="myButtonContent" HorizontalAlignment="Left" VerticalAlignment="Center" TextElement.Foreground="{StaticResource ButtonForegroundBrush}"/>
<StackPanel x:Name="Buttons" Grid.Column="1" Orientation="Horizontal" Visibility="Collapsed">
<Button x:Name="ResetButton" Style="{StaticResource styleInputBoxSubButton}" Content="{StaticResource symbolCancel}" FontFamily="{StaticResource symbolCancelFF}" Command="{Binding ResetValueCommand}"/>
</StackPanel>
</Grid>
</Border>
</DockPanel>
</Border>
</ControlTemplate>
这就是它的样子:
<Button x:Name="btnIcon" Grid.Column="1" Grid.Row="2" DataContext="{Binding Icon}"
Style="{StaticResource styleInputButton}" MinHeight="37"
FontFamily="{Binding Value, Converter={StaticResource NumberToUserIconFontFamilyConverter}}"
Content="{Binding Value, Converter={StaticResource NumberToUserIconConverter}}"
Click="IconButton_Click"/>
我的问题是点击事件。小 [X] 按钮通过 ICommand 绑定到 iValue 类。这很好用。我可以在 ControlTemplate 中将 iCommand 设置为绑定,因为这始终是相同的 iValue 属性(ResetValueCommand)。
但是,单击实际按钮的“其余部分”应该调用 ViewModel 中的方法。而且这种方法的名称并不总是相同的。它不能在 ContentTemplate 中设置。
我无法将命令绑定到 ViewModel,因为 DataContext 已经是 iValue。我曾尝试使用 Click 事件。但是这个事件也是通过点击[X]按钮触发的。
这个按钮应该经常使用。需要一个优雅的解决方案。最简单的事情是,如果我可以在 page-XAML 的 ContentTemplate 中为特定元素指定数据上下文和绑定。或者在 page-XAML 中的 ContentTemplate 中指定元素的点击事件。