MVVM - ListView的itemsSource绑定与ListView元素的绑定不同。

3

我有一个问题,而不是问题。 我在XAML中有我的listView:

<ListView Margin="25,10,25,10" Name="BookListView" ItemsSource="{Binding Books}" DockPanel.Dock="Top">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Name}"/>
                <StackPanel>
                    <TextBlock Text="Number: " />
                    <TextBlock Text="{Binding Number}" />
                </StackPanel>

                <Button Content="Read" Visibility="Hidden" Name="ReadButton" Command="{Binding ReadCommand}"/>
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Mode=TemplatedParent}}" Value="True">
                    <Setter TargetName="ReadButton" Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

以下是我的DataContext:

public MainWindow()
{
    InitializeComponent();
    DataContext = new BookListViewModel();
}

我的listView的itemsSource绑定到我viewModel中名为“Book”的元素的observableCollection中,一切正常(在这段代码中,我删除了指定窗口外观的所有代码)。
我的问题是,我的列表中的每个元素都包含一个按钮,当单击元素时会显示出来。如果我像在此代码中所做的那样绑定我的命令,应用程序将期望我的ReadCommand在Book类代码中,这违反了我一直认为的MVVM模式。
因此,我的问题是 - 在MVVM模式中,这种解决方案是否可接受?如果不行,那么如何从在listView中绑定observableList返回到在我的按钮中绑定viewModel?

1个回答

3

Book 类中拥有一个 ReadCommand 属性并不会以任何方式违反 MVVM。然而,将 ReadCommand 放在你的视图模型中可能更加合理和方便。在这种情况下,你可以使用 RelativeSource 来获取 ListView 的 DataContext,实际上就是视图模型:

<Button Content="Read" Visibility="Hidden" Name="ReadButton"
        Command="{Binding Path=DataContext.ReadCommand, RelativeSource={RelativeSource AncestorType=ListView}}"/>

哈,谢谢,正是我想要的。这是我用 MVVM 进行的第一个项目,但我认为不应该将命令放在模型类中。 - Dess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接