【问题标题】:WPF DataGrid - add new row / DataContextWPF DataGrid - 添加新行/DataContext
【发布时间】:2014-12-13 17:44:49
【问题描述】:

我有多个 DataGrid 来管理我的数据库中的数据。 该功能还包括添加新行。但问题是,在我给定的示例中,创建的行与另一个 DataGrid 设置的 DataGrid 的 DataContext 之间存在依赖关系。 就我而言,我有:

Parties - 一个派对可以有 n 个曲目。如果您更改派对 DataGrid 的选择,您将更改 Track DataGrid 的视图。

Tracks - Track 本质上是对派对的引用。

XAML:

        <DataGrid AutoGenerateColumns="False" SelectionMode="Single" DataContext="{Binding CurrentParty}" ItemsSource="{Binding Tracks}" SelectedItem="{Binding CurrentTrack}">
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="_Delete" Command="{Binding DeleteTrackCommand}"/>
                </ContextMenu>
            </DataGrid.ContextMenu>
            <DataGrid.Columns>
                <DataGridTextColumn IsReadOnly="True" Header="Votes" Binding="{Binding Path=Votes}">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="Background" Value="LightGray" />
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>
                <DataGridTemplateColumn Header="Interpret" IsReadOnly="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Interpret}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Interpret}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Title" IsReadOnly="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Title}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Title}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="URL" IsReadOnly="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Url}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Url}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

ViewModel 中的代码:

public TrackVM() {
   // requires the "CurrentParty" from DataContext.
}

我可以在后面的代码中访问 DataContext,但这会破坏 MVVM 架构,不是吗。 我想要做/拥有的是:将 CurrentParty 对象传递给默认构造函数。

【问题讨论】:

    标签: c# wpf xaml mvvm datagrid


    【解决方案1】:

    作为一种解决方法,我执行了以下操作: 我将 TrackVM 包装在一个名为 TracksVM 的包装类中的 ObservableCollection 中。在那里,我向集合的 CollectionChanged 事件注册了一个函数。如果添加了新的 TrackVM,则此事件处理程序通过属性设置所需的引用。

    【讨论】: