为什么我的视图没有更新视图模型更改?

时间:2017-09-11 20:23:10

标签: c# wpf mvvm mvvm-light

POSSalesViewModel 中的父视图模型命令方法 我知道我可能已经用下面的代码打破了mvvm的概念,但我是新手,并且对此有任何改进。

private void AddProduct(ProductDTO productDTO)
{
    var ctx = (POSSalesDetailsViewModel)((POSSalesDetailsView)TabItems[_selectedTabIndex].Content).DataContext;
    ctx.ProductLines.Add(new ProductLine()
    {
        Product = productDTO.Description,
        Quantity = 1,
        ProductTradeChannelId = productDTO.ProductTradeChannelId,
        Amount = productDTO.Amount
    });
}

子视图模型POSSalesDetailsViewModel
已达到集合,但视图未更新

public ObservableCollection<ProductLine> ProductLines
{
    get => _productLines;
    set { Set(ref _productLines, value); }
}

这里是绑定到集合的子视图

<DataGrid x:Name="ProductTypesDataGrid" ItemsSource="{Binding ProductLines, Mode=TwoWay}"
        AutoGenerateColumns="False" CanUserSortColumns="True" CanUserAddRows="False">
    <DataGrid.Columns>
        <materialDesign:MaterialDataGridTextColumn IsReadOnly="True" Binding="{Binding Product, Mode=TwoWay}"
                                                Header="Product" Width="Auto" />
        <materialDesign:MaterialDataGridTextColumn IsReadOnly="True"
                                                Binding="{Binding Quantity, Mode=TwoWay}"
                                                Header="Quantity" Width="Auto" />
        <materialDesign:MaterialDataGridTextColumn IsReadOnly="True"
                                                Binding="{Binding Amount, Mode=TwoWay}"
                                                Header="Price" Width="Auto" />

        <DataGridTemplateColumn Width="Auto">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Delete"
                            Command="{Binding DataContext.DeleteCommand, 
                            RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                            CommandParameter="{Binding}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

注意

正在构造函数中创建子视图模型实例,以便每次都获取一个新实例(而不是mvvmlight方式)

public POSSalesDetailsView()
{
    InitializeComponent();
    this.DataContext = new POSSalesDetailsViewModel();
}

1 个答案:

答案 0 :(得分:1)

在调试我的问题后,我想出了问题所在。

        <TabControl Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"
            ItemsSource="{Binding TabItems}"
            SelectedIndex="{Binding SelectedTabIndex}">
        <TabControl.ItemTemplate>
            <!-- this is the header template-->
            <DataTemplate>
                    <TextBlock
                        Text="{Binding Header}" />                    
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <!-- this is the body of the TabItem template-->
            <DataTemplate>
                <local:POSSalesDetailsView/>//**Problem is here**
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

问题是在父视图加载上创建了用户控件实例。因此,当我请求在选项卡项中添加新用户控件时,创建了一个新实例。而且数据没有出现。所以我将用户控件移到了这一部分。

                <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <TextBlock
                        Text="{Binding Header}" />
                    <local:POSSalesDetailsView Grid.Row="1"/> // **Here**
                </Grid>
            </DataTemplate>
        </TabControl.ItemTemplate>