Xaml 从UserControl获取ListBox数据上下文

Xaml 从UserControl获取ListBox数据上下文,xaml,windows-phone-8,Xaml,Windows Phone 8,我有一个用户控件,里面有一个按钮。UserControl及其DataContext是我的模型之一,因此我可以绑定到它。但是,对于按钮,我希望能够从我的viewmodel调用一个方法。列表框的DataContext是这个ViewModel 因为我的ContextMenu也需要相同的DataContext,所以我将它们绑定为: Command="{Binding Path=DataContext.AttendEventCommand, ElementName=EventListBox}" Data

我有一个用户控件,里面有一个按钮。UserControl及其DataContext是我的模型之一,因此我可以绑定到它。但是,对于按钮,我希望能够从我的viewmodel调用一个方法。列表框的DataContext是这个ViewModel

因为我的ContextMenu也需要相同的DataContext,所以我将它们绑定为:

Command="{Binding Path=DataContext.AttendEventCommand, ElementName=EventListBox}"
DataContext="{Binding Path=EventList, Source={StaticResource Locator}}
调用EventListBox元素并使用其DataContext调用AttentDeventCommand。但是,我想从UserControl上的按钮调用AttentDeventCommand。我试着用同样的方法做,但遗憾的是它不起作用

我的数据上下文设置如下:

Command="{Binding Path=DataContext.AttendEventCommand, ElementName=EventListBox}"
DataContext="{Binding Path=EventList, Source={StaticResource Locator}}
我的列表框代码:

<ListBox x:Name="EventListBox" ItemsSource="{Binding Occurrences}" Margin="0,50,0,0" >
    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <uctl:EventListItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="auto" Height="auto">
                                    <toolkit:ContextMenuService.ContextMenu>
                                        <toolkit:ContextMenu IsZoomEnabled="True" x:Name="ContextMenu">
                                            <toolkit:MenuItem x:Name="Going" Header="{Binding AttendingText}" Command="{Binding Path=DataContext.AttendEventCommand, ElementName=EventListBox}" CommandParameter="{Binding}"/>
                                        </toolkit:ContextMenu>
                                    </toolkit:ContextMenuService.ContextMenu>
                                </uctl:EventListItem>
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
</ListBox>

和我的用户控件的按钮:

<Button Grid.RowSpan="3" Grid.Column="5" Opacity="0" Command="{Binding Path=DataContext.AttendEventCommand, ElementName=EventListBox}" CommandParameter="{Binding}"/>

您的
EventListItem
DataContext
将是您的
itemsource
的模型,因为它是
数据模板的一部分。所以你必须明确地设置它

有关我将用作解决方案的一些代码,请参阅


假设您的自定义
UserControl
非常基本,如下所示:


其中SimpleCommand是要在俯视图模型中调用的命令

然后您必须将
DataTemplate
更改为


您的
应该按原样工作


ICommand
的Execute函数处放置一个断点,您将看到它将 每次都打那里

public void Execute(对象参数)
{
//当用户点击命令时执行的逻辑
int debug_var=0;//在此处放置断点
}

我相信你的问题不在于你想做的事情不起作用;相反,您的设计似乎是错误的

您现在拥有的是这样的: 您有一个
窗口
,其中有一个
数据上下文
和一个
列表框
ListBox
有一个
itemsource
,我们假设它是一些
IEnumerable

列表框中每个项目的外观都是一个
事件列表项目
,它是一个
用户控件
,至少包含一个
按钮

您希望此
按钮
命令
调用
窗口
数据上下文
上的方法

最后一句是错的。项目具有按钮这一事实意味着它执行与项目相关的操作,而不是窗口内容。如果不是这样,那么可能应该重新考虑窗口和列表框项目的视觉设计

如果按钮实际上影响了项目,则不应在
窗口的
DataContext
上调用方法,而应在项目的
DataContext
上调用方法


解决方案是将模型对象
引用
包装在其自己的视图模型类中。我们称之为发生视图模型。您的
ListBox
itemsource
将是某种形式的
IEnumerable
。因为它是一个视图模型,所以允许它实现
命令
方法,然后这些方法可以以某种方式操纵
事件
,可以直接操作,也可以最好通过将其传递给实现用例的某个类来操作。

我在代码中没有看到您实际设置列表框的DataContext的地方<代码>项目资源!=DataContext
,因此您为命令所做的绑定将永远无法工作。我省略了代码的这一部分,因为对我来说很明显,我会首先设置DataContext。我已经在示例中添加了设置datacontext的代码行以进行说明。UserControl中的其他项确实需要绑定到ItemSource,通过更改整个UserControl的datacontext,这将中断。谢谢你的回答。