Listview中的mvvm ComboBox选择

时间:2014-08-27 10:53:00

标签: wpf xaml listview mvvm combobox

我正在尝试在wpf-Listview中显示一组对象,并提供一个组合框,用于从其他集合中选择值。

一些代码来说明我的问题:

XAML: (Window gets its DataContext set in app.xaml.cs)

<ListView ItemsSource="{Binding Path=Books}" SelectedItem="{Binding Path=CurrentBook}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="author" DisplayMemberBinding="{Binding author}" />
            <GridViewColumn Header="title" DisplayMemberBinding="{Binding title}" />
            <GridViewColumn Header="genre">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Genres}" IsSynchronizedWithCurrentItem="true" DisplayMemberPath="genreName" SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre}">
                        <ComboBox.ItemTemplate>
                            <StackPanel Orientation="Horizontal">
                               <TextBlock Text="{Binding genreName}" />
                               <TextBlock Text="{Binding genreDescription}" />
                            </StackPanel>
                     </DataTemplate>
                </GridViewColumn.CellTemplate>
           </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

现在是“CurrentBook_Genre”是MainWindowViewModel的一个属性,ListView中显示的Item的相应值由其setter设置。

就像在ListView的每个“行”中显示相同的ComboBox一样。 我想我需要某种“EditValueTemplate”和“ShowValueTemplate”以及某种类型的选择器,如果ComboBox仅显示在编辑模式的行中,那就没问题了 - 我想这是常见的事情。大多数DataDriven应用程序,所以也许有一种方法更容易我不知道。

对此的唯一好解释是 http://tech.pro/tutorial/857/wpf-tutorial-using-the-listview-part-3-in-place-edit 但他们正在使用依赖项属性,与使用的ViewModel包装模型相反。

1 个答案:

答案 0 :(得分:0)

在编辑网格行时,有一种更简单的方法可以显示一个控件,而在编辑网格行时,可以更方便地显示一个控件,而不是您找到的示例。试试这个:

<DataGrid ItemsSource="{Binding Books}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre.genreName}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Genres}" IsSynchronizedWithCurrentItem="true" DisplayMemberPath="genreName" SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在编辑行时会显示ComboBox,而在编辑行时会显示普通的TextBlock