wpf中模板的访问方法

wpf中模板的访问方法,wpf,xaml,caliburn.micro,Wpf,Xaml,Caliburn.micro,我正在使用带有caliburn微框架的WPF来实现MVVM模式。 我创建了一个弹出窗口,在列表框中填充了自定义按钮。 现在我想在单击其中一个按钮时调用ViewModel中的一个方法,但迄今为止我尝试的每种方法都失败了 这里,注释中的代码在调用我的方法的意义上工作,但参数始终为null <ListBox x:Name="lst" ItemsSource="{Binding OperatingModes}" ItemTemplate="{DynamicResource DataTemplate

我正在使用带有caliburn微框架的WPF来实现MVVM模式。 我创建了一个弹出窗口,在列表框中填充了自定义按钮。 现在我想在单击其中一个按钮时调用ViewModel中的一个方法,但迄今为止我尝试的每种方法都失败了

这里,注释中的代码在调用我的方法的意义上工作,但参数始终为null

<ListBox x:Name="lst" ItemsSource="{Binding OperatingModes}" ItemTemplate="{DynamicResource DataTemplate_Level1}" BorderThickness="0" ScrollViewer.CanContentScroll="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="3" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <!--<i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseLeftButtonDown" >
            <cal:ActionMessage MethodName="SelectMode">
                <cal:Parameter Value="{Binding ElementName=lst, Path=SelectedItem}" />
            </cal:ActionMessage>
        </i:EventTrigger>
    </i:Interaction.Triggers>-->
</ListBox>
这是我正在使用的模板。无论何时调用此方法,都找不到方法SelectMode的目标。如您所见,我尝试了不同的方法,尽管我不确定是否正确使用了TargetWithoutContext调用。 据我所知,我需要以某种方式将我的模板绑定到普通xaml代码的数据上下文中,但到目前为止我失败了。如何正确访问我的方法

<DataTemplate x:Key="DataTemplate_Level1" x:Name="myListTemplate" >
    <ListBox ItemsSource="{Binding}" BorderThickness="0" ScrollViewer.CanContentScroll="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
        <StackPanel Orientation="Vertical" HorizontalAlignment="Center" cal:Bind.Model="{Binding}" cal:Action.TargetWithoutContext="{Binding DataContext, ElementName=lst}">
            <Button Style="{StaticResource InformButton}" Content="{Binding Path=Name}" FontSize="11" BorderBrush="BlueViolet" cal:Message.Attach="SelectMode($dataContext)">
                <!--<i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseRightButtonDown" >
                        <cal:ActionMessage MethodName="SelectMode">
                            <cal:Parameter Value="{Binding ElementName=myListTemplate, Path=SelectedItem.Name}" />
                        </cal:ActionMessage>
                    </i:EventTrigger>
                </i:Interaction.Triggers>-->
            </Button>
        </StackPanel>
    </ListBox>
</DataTemplate>

如果您需要单击事件,那么您可能会绑定Button的命令并使用CommandParameter={Binding},这应该可以做到。我不需要单击事件,使用按钮只是最简单的方法,因为我可以重用打开弹出窗口的按钮的样式。使用Commandand CommandParameter也会导致相同的错误。如果可以在按钮上看到正确的名称,则设置CommandParameter={Binding}将把完整的数据项推送到命令,CommandParameter={Binding name}将发送name属性的值。您是否可以分享一份复制该问题的工作样本?我可以帮你修一下吗。或者,您至少可以发布命令实现,并确认命令是否正在执行。我还注意到,DataTemplate中没有为ListBox定义ItemTemplate,但是StackPanel似乎是它的子项。这看起来有点奇怪。@pushpraj我不确定我能不能生成一个工作示例,因为这是一个不小的项目的一部分,我还需要发布至少几个助手类。我最初使用,但后来意识到我可以用ListBox做同样的事情,这样做的好处是不需要2D输入数组,并且实现了SelectedItem。因此,也许我对xaml代码做了一点修改,但它仍然有效。@pushpraj基于我上面的代码,您的命令建议的实现如上所示,只有按钮打开标记如下:。SelectMode是我的ViewModel中的方法名称,但该方法从未被调用。