MVVM - listview itemsSource绑定不同于listview的绑定元素

时间:2014-09-23 17:52:33

标签: c# wpf xaml mvvm data-binding

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

1 个答案:

答案 0 :(得分:3)

ReadCommand类中拥有Book属性不会以任何方式违反MVVM。但是,在视图模型中使用ReadCommand可能更合理,更方便。在这种情况下,您可以使用RelativeSource来访问ListView的DataContext,它实际上是视图模型:

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