您好我正在尝试将ListB和binded命令中的AppBarButton添加到ViewModel中的RelayCommand这里是我的xaml代码
<DataTemplate x:Key="MyTemplage" >
<Grid HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<AppBarButton Grid.Column="1" Command="{Binding DoCommand,Mode=OneWay}">
<AppBarButton.Icon>
<BitmapIcon UriSource="ms-appx:///assets/doIcon.png"></BitmapIcon>
</AppBarButton.Icon>
</AppBarButton>
</DataTemplate>
<ListView HorizontalAlignment="Left" Margin="0,45,0,0" Background="Khaki" VerticalAlignment="Top" ItemsSource="{Binding AList, Mode=TwoWay}"
ItemTemplate="{StaticResource MyTemplage}">
</ListView>
这是我在VM中的中继命令代码
private RelayCommand _DoCommand;
/// <summary>
/// Gets.
/// </summary>
public RelayCommand DoCommand
{
get
{
return _DoCommand
?? (_DoCommand = new RelayCommand(
() =>
{
DoSomething();
}));
}
}
DoCommand没有在ViewModel中提升。如果我在代码中注册click事件处理程序,它工作正常。如果我在Page.Bottombar中使用它,AppBarButton对MVVM也很好。
任何想法?
答案 0 :(得分:2)
问题是ListView DataTemplate内部的绑定不是针对ViewModel对象,而是针对不同的DataContext,在您的情况下,它绑定到名为AList的列表,该列表在ViewModel 中并包含模型类列表 - 因此绑定引擎实际上是在该模型类中查找DoCommand。
为了使绑定起作用,您必须确保绑定指向RelayCommand实际所在的整个ViewModel DataContext。您可以这样做的一种方法是绑定到页面中的某个元素,该元素的DataContext设置为整个ViewModel:
Command="{Binding DataContext.DoCommand, ElementName=pageRoot, Mode=OneWay}"
在这种情况下,我绑定到pageRoot,其中pageRoot是页面的根页面元素的名称,它具有正确的DataContext集 - 实际上是RelayCommand的ViewModel。