将不同的 DataContext 设置为 WPF 中 ControlTemplate 中的元素

Set Diffrent DataContext to an Element in a ControlTemplate in WPF

我无法再进一步了。

我的结构是这样的:

ViewModel (Class)
   Property Number (Class, iValue)
                Value, InputValidationInfo, etc.
   Property Icon (Class, iValue)
                Value, InputValidationInfo, etc.

页面的 DataContext 是 ViewModel。页面上有输入字段。这些被分配给其中一个 iValues(数字、图标)。所有输入字段都有一个 ContentTemplate。 ContentTemplate 包含一些绑定到 iValue-class.

属性的元素
<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 classes。这很好用。我可以将 iCommand 设置为 ControlTemplate 中的绑定,因为它始终是相同的 iValue-属性 (ResetValueCommand).

但是,单击实际按钮的“其余部分”应该会调用 ViewModel 中的方法。而且这个方法的名称并不总是相同的。不能在ContentTemplate中设置。

我无法将命令绑定到 ViewModel,因为 DataContext 已经是 iValue。 我试过使用 Click 事件。但是这个事件也是通过点击[X]-按钮触发的。

这个按钮应该经常使用。需要一个优雅的解决方案。最简单的事情是,如果我可以在 page-XAML 的 ContentTemplate 中为特定元素指定数据上下文和绑定。或者在page-XAML.

中指定ContentTemplate中某个元素的点击事件

I cannot bind the command to the ViewModel, because the DataContext is already the iValue ...

您可以指定绑定的来源,而不考虑其 DataContext:

<Button x:Name="btnIcon" ...
        Command="{Binding DataContext.CommandPropertyOfViewModel, 
            RelativeSource={RelativeSource AncestorType=Page}}"/>