【问题标题】:AppBarButton is not binding to MVVM Relay command in ListViewAppBarButton 未绑定到 ListView 中的 MVVM 中继命令
【发布时间】:2014-05-24 12:32:36
【问题描述】:

您好,我正在尝试在 ListView 中添加 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 中的 Relay 命令代码

private RelayCommand _DoCommand;

    /// <summary>
    /// Gets.
    /// </summary>
    public RelayCommand DoCommand
    {
        get
        {
            return _DoCommand
                ?? (_DoCommand = new RelayCommand(
                                      () =>
                                      {
                                          DoSomething();
                                      }));
        }
    }

DoCommand 未在 ViewModel 中引发。如果我在后面的代码中注册 click 事件处理程序,它就可以正常工作。如果我在 Page.Bottombar 中使用 AppBarButton,它也可以与 MVVM 配合使用。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    问题是 ListView DataTemplate 内的绑定不是到 ViewModel 对象,而是到不同的 DataContext,在您的情况下,它绑定到一个名为 AList 的列表,该列表位于 ViewModel 内并包含模型类列表 - 因此绑定引擎本质上是在该模型类中寻找 DoCommand。

    为了使绑定起作用,您必须确保绑定指向整个 ViewModel DataContext,即 RelayCommand 实际所在的位置。一种方法是绑定到页面中的某个元素,该元素的 DataContext 设置为整个 ViewModel:

    Command="{Binding DataContext.DoCommand, ElementName=pageRoot, Mode=OneWay}"
    

    在这种情况下,我绑定到 pageRoot,其中 pageRoot 是您的页面的根页面元素的名称,该元素具有正确的 DataContext 集 - RelayCommand 实际所在的 ViewModel。

    【讨论】:

    • 感谢 igrali,我在发帖后发现了问题,但不是解决方案 :) 您的解决方案非常完美,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多