1

我不能再进一步了。

我的结构如下所示:

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 中指定元素的点击事件。

4

1 回答 1

1

我无法将命令绑定到 ViewModel,因为 DataContext 已经是 iValue ...

您可以为绑定指定一个源,而不管它的DataContext

<Button x:Name="btnIcon" ...
        Command="{Binding DataContext.CommandPropertyOfViewModel, 
            RelativeSource={RelativeSource AncestorType=Page}}"/>
于 2020-09-03T20:53:07.070 回答