命令绑定不会传播以控制到ItemTemplate的DataTemplate

时间:2016-10-03 15:30:58

标签: c# wpf user-controls datatemplate commandbinding

对于Command“CommandZoomIn”,对于ListBox ItemTemplate中定义的控件,不会发生CanExecute和Execute。当GraphLcView UserControl直接定义为AnalysisView的子类时,GraphLcView方法“CanExecute”和“Execute”都被调用,但是当它们作为ListBox ItemTemplate的Item DataTemplate添加时,它们都不会被调用。

  • 带有命令的按钮在我的顶级窗口中定义为功能区。
  • 简化的层次结构:
    • (工作)顶级窗口 - > AnalysisView - > GraphLcView
    • (不工作)顶级窗口 - > AnalysisView - > ListBox + ItemTemplate - > GraphLcView
  • CommandBinding被定义为GraphLcView子控件(UserControl.CommandBinding)
  • CommandBindind
  • 中没有隐含的MVVM

更新:我制作了一个工作示例来演示问题,但我的行为与此处解释的不同。但是完全正常工作的样本应该显示出类似于我在这里的东西。因为行为不同,我问another question at StackOverflowCode is available here at GitHub

用户控制'GraphLcView'部分代码:

<UserControl x:Class="GraphCtrl.GraphView.GraphLcView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

...

                  

<Grid.CommandBindings>
    <CommandBinding Command="{x:Static graphCtrlCommand:CtrlAnalysisCommand.CommandZoomToFitsAll}" CanExecute="CanZoomToFitsAll" Executed="ZoomToFitsAll"/>
    <CommandBinding Command="{x:Static graphCtrlCommand:CtrlAnalysisCommand.CommandZoomIn}" CanExecute="CanZoomIn" Executed="ZoomIn"/>
    <CommandBinding Command="{x:Static graphCtrlCommand:CtrlAnalysisCommand.CommandZoomOut}" CanExecute="CanZoomOut" Executed="ZoomOut"/>

UserControl AnalysisView部分代码(使用以前的GraphLcView UserControl):

                <!-- ********************************-->
                <!-- ********************************-->
                <!-- CommmandBinding works fine here -->
                <!-- ********************************-->
                <!-- ********************************-->
                <graphView1:GraphLcView Grid.Row="1" x:Name="GraphView" Graph="{Binding Graph}" 
                                        Visibility="{Binding IsMain, Converter={StaticResource BooleanToVisibilityConverter1}}"
                                        TrackedSignal="{Binding DataContext.LastTrackedSignal, Mode=TwoWay, ElementName=MyControl}"
                                        SourceTrackedSignal ="{Binding Model.EventTrackingSourceGraphToLegend, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ElementName=MyControl}"
                                        IsMouseInteractive="{Binding IsMouseInteractive}"
                                        UseFastTooltip="{Binding UseFastTooltip}"
                                        ActiveObjectChanged="OnChildActiveObjectChanged"
                                        >
                </graphView1:GraphLcView>

                <Grid Name="GridDetails" Grid.Row="1" >
                    <ListBox Name="ListBoxDetails"  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                         ItemsSource="{Binding Graph.AdditionalViews}"
                         Visibility="{Binding IsDetails, Converter={StaticResource BooleanToVisibilityConverter1}}"
                         HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel IsItemsHost="True"
                                       Name="DetailsWrapPanel"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>

                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Border BorderBrush="Black" BorderThickness="1" Margin="0,1,0,1"
                                        Width="{Binding DataContext.DetailsWorkspaceDimensionX, ElementName=MyControl, Mode=OneWay}"
                                        Height="{Binding DataContext.DetailsWorkspaceDimensionY, ElementName=MyControl, Mode=OneWay}"
                                        >
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"></RowDefinition>
                                            <RowDefinition></RowDefinition>
                                            <RowDefinition Height="Auto"></RowDefinition>
                                        </Grid.RowDefinitions>

                                        <TextBlock Grid.Row="0" Text="{Binding Name}"></TextBlock>

                                        <!-- ********************************-->
                                        <!-- ********************************-->
                                        <!-- Binding does not work fine here -->
                                        <!-- ********************************-->
                                        <!-- ********************************-->

                                        <!--ActiveObjectChanged="GraphLcViewDetailOnActiveObjectChanged"-->
                                        <!--SourceTrackedSignal="{Binding DataContext.EventTypeSourceForSignalTrackingToGraph, Mode=TwoWay, ElementName=MyControl}"-->
                                        <graphView1:GraphLcView Grid.Row="1"
                                            AdditionalView="{Binding Path=., Mode=OneWay}"
                                            Graph="{Binding Graph, ElementName=GraphView}" 
                                            TrackedSignal="{Binding DataContext.LastTrackedSignal, Mode=TwoWay, ElementName=MyControl}"
                                            SourceTrackedSignal ="{Binding Model.EventTrackingSourceGraphToLegend, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ElementName=MyControl}"
                                            IsMouseInteractive="{Binding IsMouseInteractive}"
                                            UseFastTooltip="{Binding UseFastTooltip}"
                                            ActiveObjectChanged="OnChildActiveObjectChanged"
                                            >
                                        </graphView1:GraphLcView>
                                    </Grid>
                                </Border>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </Grid>

1 个答案:

答案 0 :(得分:0)

对不起。经过调查,我意识到问题来自LightningChart控件,它没有保持焦点。我为&#34; GotFocus&#34;添加了2个处理程序。和&#34; LostFocus&#34;。然后我意识到第一个选项卡中的控件一切正常,这不是ListBox itemTemplate的一部分。但是,在第二个标签中,所有其他的,进入ListBox itemTemplate,一旦他们得到它没有特别的原因(至少没有我能理解)失去焦点。

我把问题发给了LightningChart旗下的公司Arction,他们告诉我他们会尽快修复它。