将Different DataContext设置为WPF中ControlTemplate中的元素
我再也找不到了 我的结构如下所示:将Different DataContext设置为WPF中ControlTemplate中的元素,wpf,vb.net,contenttemplate,Wpf,Vb.net,Contenttemplate,我再也找不到了 我的结构如下所示: ViewModel (Class) Property Number (Class, iValue) Value, InputValidationInfo, etc. Property Icon (Class, iValue) Value, InputValidationInfo, etc. 页面的DataContext是ViewModel。页面上有输入字段。这些被分配给一个iValu
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。
我已尝试使用单击事件。但点击[X]-按钮也会触发此事件
这个按钮应该经常使用。需要一个优雅的解决方案。最简单的事情是,如果我可以在页面XAML的ContentTemplate中为特定元素指定数据上下文和绑定。或者在页面XAML的ContentTemplate中指定元素的单击事件
我无法将该命令绑定到ViewModel,因为DataContext已经是iValue
您可以为绑定指定源,而不考虑其DataContext
:
<Button x:Name="btnIcon" ...
Command="{Binding DataContext.CommandPropertyOfViewModel,
RelativeSource={RelativeSource AncestorType=Page}}"/>
基于此,我认为您可能需要为按钮设置一个单独的viewmodel?然后,按钮可以具有与表单不同的上下文。