wpf - 父子数据网格在 MVVM 中具有不同的 ItemsSource

标签 wpf silverlight xaml mvvm mvvm-light

我有一个 DataGrid,在那个 DataGrid 的 DataGrid.RowDetailsTemplate 中我放了另一个 DataGrid。现在我的第一个 Datagrid 有 ItemsSource="{Binding MatchObsCollection}"并且我的 DataGrid.RowDetailsTemplate 中的内部 Datagrid 有单独的 ItemSource。但是内部 Datagrid 没有填充。我正在使用 MVVM,并且我通过 Viewmodel 上的 ObservableCollections 绑定(bind)了两个 Datagrid 。谁能帮助我(我的问题几乎与 Displaying hierarchal parent child data in WPF DataGrid 相同,但我在那篇帖子中也没有找到任何好的答案)。我的 xaml 代码附在下面。谢谢,

<DataGrid HorizontalAlignment="Stretch" Margin="0" x:Name="dataGridParent" ItemsSource="{Binding MatchObsCollection}"
                      Style="{StaticResource EfesDataGridStyle}" FrozenColumnCount="14" GridLinesVisibility="All" 
                      HorizontalGridLinesBrush="#DADADA" VerticalGridLinesBrush="#DADADA" Cursor="Hand" AutoGenerateColumns="False" 
                      RowDetailsVisibilityMode="Visible" 
                      util:ParentMatchDataGridRowClickHandler.MethodName="ParentMatchDatagrdRowClick"
                      SelectedItem="{Binding SelectedMatch}"
                      >
<DataGrid.Columns>
                    <DataGridTextColumn Header="Kod" Binding="{Binding MatchNo}"  Width="50*" />
                    <DataGridTextColumn Header="Tarih" Binding="{Binding MatchDate}" Width="70*"/>
                    <DataGridTextColumn Header="Ev Sahibi" Binding="{Binding MatchHome}" Width="100*"/>
                    <DataGridTextColumn Header="Konuk" Binding="{Binding MatchVisitor}" Width="50*"/>
                    <DataGridTextColumn Header="1" Binding="{Binding MatchResultHomeOdds}" Width="30*" ></DataGridTextColumn>                 

                    <DataGridTextColumn Header="X" Binding="{Binding MatchResultDrawOdds}" Width="30*" />
                    <DataGridTextColumn Header="2" Binding="{Binding MatchResultVisitorOdds}" Width="30*"/>
                    <DataGridTextColumn Header="T1" Binding="{Binding MatchresultSingleHomeOdds}" Width="30*" />
                    <DataGridTextColumn Header="TX" Binding="{Binding MatchresultSingleDrawOdds}" Width="30*" />
                    <DataGridTextColumn Header="T2" Binding="{Binding MatchresultSingleVisitorOdds}" Width="30*" />
                    <DataGridTextColumn Header="+"  CellStyle ="{StaticResource DataGridCellStyle}"  Binding="{Binding TotalBets}" Width="30*"/>


                    <DataGridTextColumn Header="Min" Binding="{Binding MatchMin}" Width="30*" />
                    <DataGridTextColumn Header="Lig" Binding="{Binding TeamName}" Width="70*" />

                    <DataGridTemplateColumn Header="Durum" Width="Auto" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ToggleButton  x:Name="toggleBtn" VerticalAlignment="Center" Margin="0" Style="{StaticResource SlidingToggleButton}" BorderBrush="{x:Null}" IsChecked="{Binding ToggleBtn}" Background="#FF2F63FF" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>                    
                </DataGrid.Columns>

<DataGrid.RowDetailsTemplate x:Uid="test123">
                    <DataTemplate x:Name="testTemplete">
                        <DataGrid x:Name="innerGrid" ItemsSource="{Binding SubBetMatchDataListforChildGrid}" 
                                  Style="{StaticResource EfesDataGridStyle}" Margin="50,2,2,2" MinHeight="40"  
                                  GridLinesVisibility="All" HorizontalGridLinesBrush="#DADADA" VerticalGridLinesBrush="#DADADA" 
                                  Visibility="Collapsed" >

<DataGrid.Columns>
                                <DataGridTextColumn Header="Kod" Binding="{Binding Code}" Width="3*" />
                                <DataGridTextColumn Header="Alt Secenakler" Binding="{Binding SubOptions}" Width="7*" />                                
                            </DataGrid.Columns>

</DataGrid>                      
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>

最佳答案

I am using MVVM and I am binding both the Datagrid s by ObservableCollections on Viewmodel.



你应该只有一个 ObservableCollection ( MatchObsCollection ) 在您的 ViewModel 中。
如果您有 MatchObsCollectionSubBetMatchDataListforChildGrid在 ViewModel 中,此代码不起作用。
DataContextRowDetails是行项目。

所以如果你想绑定(bind)到 ObservableCollection在 ViewModel 中,您应该在 RowDetailsTemplate 中使用以下代码:
...
<DataGrid.RowDetailsTemplate x:Uid="test123">
        <DataTemplate x:Name="testTemplete">
            <DataGrid x:Name="innerGrid" 
                      ItemsSource="{Binding Path=DataContext.SubBetMatchDataListforChildGrid, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" 
...

如果要绑定(bind)到选定的对象内部ObservableCollection您的类(class)应如下所示:
class Foo
{
    public int MatchNo { get; set; }
    public DateTime MatchDate { get; set; }
    // more properties
    public ObservableCollection<Boo> SubBetMatchDataListforChildGrid { get; set; }
}

class Boo
{
    public string Code { get; set; }
    public string SubOptions { get; set; }
}

在 ViewModel 中你应该有 ObservableCollection富:
class MainViewModel
{
    public ObservableCollection<Foo> MatchObsCollection { get; set; }   
}

关于wpf - 父子数据网格在 MVVM 中具有不同的 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805893/

相关文章:

xml - 银光 3 : Converting XML stroke collection back into a strokecollection?

c# - 如何在 WPF ComboBox 中使用 MultiBinding

wpf - 异常 : 'IValueConverter' type does not have a public TypeConverter class

wpf - 如何在 CheckedComboBoxEdit 中获取选定项?

WPF:特定控件/ View / View 模型上的 LostFocus 事件

C# - 将隐式类型转换为 ObservableCollection

wpf - 类似终端的 WPF 文本框?

silverlight - 为什么我的 Windows Phone 7 单元测试都没有运行?

c# - 如何打开一个窗口然后将我的 XAML 文件加载到其中? (XAML 和 C#)

c# - C# WPF项目正确添加样式资源文件