绑定到集合WPF/VB中的列表

绑定到集合WPF/VB中的列表,wpf,vb.net,datagrid,wpfdatagrid,Wpf,Vb.net,Datagrid,Wpfdatagrid,我想知道是否有可能将datagrid列绑定到存储在可观察集合中的(T)列表 以下是我当前的代码: Dim _BindWithThis As New List(Of BindWithThis) Me.DataContext = _BindWithThis For i = 0 To 3 Dim NewList As New List(Of Double) From {i + 0.25, i + 0.5, i + 0.75} _BindWith

我想知道是否有可能将datagrid列绑定到存储在可观察集合中的(T)列表

以下是我当前的代码:

    Dim _BindWithThis As New List(Of BindWithThis)
    Me.DataContext = _BindWithThis

    For i = 0 To 3
        Dim NewList As New List(Of Double) From {i + 0.25, i + 0.5, i + 0.75}
        _BindWithThis.Add(New BindWithThis() With _ 
    {.InternalNum = i, .DataValue = NewList})
    Next

    DataGrid1.ItemsSource = _BindWithThis

    Dim NC As New DataGridTextColumn
    NC.Header = "New Column"
    NC.Width = 85
    Dim b As New Binding
    b.Path = New PropertyPath("DataValue")
    NC.Binding = b

    DataGrid1.Columns.Add(NC)
当前显示四行“(集合)”。是否可以进入其中一个“收集”行并显示数据?我知道,通过与集合中的特定元素绑定,可以对列表框执行此操作:

        ListBox1.ItemsSource = _BindWithThis.Item(0).DataValue
我只是不知道如何用datagrid来实现这一点

谢谢你的帮助


James

您需要设置
AutoGenerateColumns=“False”
并自己定义所需的列

下面是一个快速示例,它将在
列表框中显示您的收藏,而不是默认的
TextBlock

<DataGrid AutoGenerateColumns="False"
          ItemsSource="{Binding YourCollection}">
    <DataGrid.Columns>        
        <DataGridTemplateColumn Header="Column Header">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ListBox ItemsSource="{Binding MySubCollection}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

以下是我承诺的示例。这使用DataGrid.RowDetailsTemplate允许您展开/折叠数据列表。抱歉,这是C#而不是VB.NET

Xaml:

当然,您将使用ObservableCollection并为实际代码实现INotifyPropertyChanged

public class DataGridRowDetails2ViewModel
{
    public DataGridRowDetails2ViewModel()
    {
        Items = new List<DataItemWithDetails>
                    {
                        new DataItemWithDetails{ Name = "Item 1"},
                        new DataItemWithDetails{ Name = "Item 2"},
                        new DataItemWithDetails{ Name = "Item 3"},
                        new DataItemWithDetails{ Name = "Item 4"},
                    };
    }

    public IList<DataItemWithDetails> Items { get; set; }

    public bool IsChecked { get; set; }
}

public class DataItemWithDetails
{
    public DataItemWithDetails()
    {
        Doubles = new List<double> {1, 2, 3, 4};
    }

    public string Name { get; set; }

    public IList<double> Doubles { get; set; }
}
公共类DataGridRowDetails2ViewModel
{
公共DataGridRowDetails2ViewModel()
{
项目=新列表
{
新的DataItemWithDetails{Name=“Item1”},
新DataItemWithDetails{Name=“Item2”},
新的DataItemWithDetails{Name=“Item3”},
新的DataItemWithDetails{Name=“Item4”},
};
}
公共IList项{get;set;}
已检查公共布尔值{get;set;}
}
公共类DataItemWithDetails
{
公共数据项WithDetails()
{
Doubles=新列表{1,2,3,4};
}
公共字符串名称{get;set;}
公共IList双精度{get;set;}
}

您需要调查DataGrid.RowDetailsTemplate。如果没有人能比我强的话,我以后会举出一个例子来。
public partial class DataGridRowDetails2
{
    public DataGridRowDetails2()
    {
        InitializeComponent();
    }

    private void ToggleButtonChecked(object sender, RoutedEventArgs e)
    {
        var button = (ToggleButton)sender;

        DataGridRow dataGridRow = 
            (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(button.DataContext);
            dataGridRow.DetailsVisibility = 
                (button.IsChecked??false) ? Visibility.Visible : Visibility.Collapsed;
    }
}
public class DataGridRowDetails2ViewModel
{
    public DataGridRowDetails2ViewModel()
    {
        Items = new List<DataItemWithDetails>
                    {
                        new DataItemWithDetails{ Name = "Item 1"},
                        new DataItemWithDetails{ Name = "Item 2"},
                        new DataItemWithDetails{ Name = "Item 3"},
                        new DataItemWithDetails{ Name = "Item 4"},
                    };
    }

    public IList<DataItemWithDetails> Items { get; set; }

    public bool IsChecked { get; set; }
}

public class DataItemWithDetails
{
    public DataItemWithDetails()
    {
        Doubles = new List<double> {1, 2, 3, 4};
    }

    public string Name { get; set; }

    public IList<double> Doubles { get; set; }
}