AppBarButton未绑定到ListView中的MVVM Relay命令

时间:2014-05-24 12:32:37

标签: mvvm-light windows-phone-8.1 relaycommand

您好我正在尝试将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也很好。

任何想法?

1 个答案:

答案 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。