将不同的 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}}"/>
我无法再进一步了。
我的结构是这样的:
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}}"/>