Xaml 从UserControl获取ListBox数据上下文
我有一个用户控件,里面有一个按钮。UserControl及其DataContext是我的模型之一,因此我可以绑定到它。但是,对于按钮,我希望能够从我的viewmodel调用一个方法。列表框的DataContext是这个ViewModel 因为我的ContextMenu也需要相同的DataContext,所以我将它们绑定为: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
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,这将中断。谢谢你的回答。