Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Different DataContext设置为WPF中ControlTemplate中的元素_Wpf_Vb.net_Contenttemplate - Fatal编程技术网

将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?然后,按钮可以具有与表单不同的上下文。