将DataGrid绑定到ObservableCollection,它是ListBox的SelectedItem的属性

时间:2016-03-14 05:52:26

标签: c# wpf datagrid listbox polymorphism

在我的申请中,我有一个ListBox和一个DataGrid

我试图将DataGrid绑定到ObservableCollection,这是SelectedItem返回的ListBox的属性 - 这不是工作,我不明白为什么。输出控制台不会打印任何错误。

ObservableCollection属于ReportItem类型,可以包含TextReportItem的实例,其继承自ReportItem

XAML:

<ListBox x:Name="listBox" HorizontalAlignment="Left" Margin="10,10,0,36.667" Width="119" ItemsSource="{Binding ReportItems}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox> 
<StackPanel HorizontalAlignment="Left" Height="274" Margin="134,10,0,0" VerticalAlignment="Top" Width="375" >
        <StackPanel.Resources>
            <Style x:Key="ControlBaseStyle" TargetType="{x:Type Control}">
                <Setter Property="Margin" Value="0, 10, 0, 0" />
            </Style>
        </StackPanel.Resources>
        <DataGrid Height="190" VerticalAlignment="Bottom" DataContext="{Binding ElementName=listBox, Path=SelectedItem.TItems}" />
</StackPanel>

视图模型:

public class MainViewModel
{
    public ObservableCollection<ReportItem> ReportItems { get; set; }
    public object SelectedReportItem { get; set; }
    public MainViewModel()
    {
        ReportItems = new ObservableCollection<ReportItem>();
        ReportItems.Add(Example);
    }
    // line below is for debugging purposes
    public TextReportItem Example = new TextReportItem() { Name = "ti1", DataFile = "ti1.txt"};
}

ReportItem

public class ReportItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string DataFile { get; set; }
}

TextReportItemTextParcel

public class TextReportItem : ReportItem
{
    public ObservableCollection<TextParcel> TItems { get; set; }
    public TextReportItem()
    {
        TItems = new ObservableCollection<TextParcel>();
    }
}
public class TextParcel
{
    public char Delimiter { get; set; }
    public string LineExp { get; set; }
    public string Result { get; set; }
    public string IgnoreLine { get; set; }
    public int DesiredResultIndexInLine { get; set; }
}

3 个答案:

答案 0 :(得分:1)

我认为仅仅DataContext并没有告诉DataGrid它必须显示什么。你必须给它一个ItemsSource。也许你可以试试这样的事情:

<DataGrid 
     DataContext="{Binding ElementName=listBox, Path=SelectedItem}"
     ItemsSource="{Binding TItems}" />

答案 1 :(得分:0)

我相信DataGrid的DataContext需要一个IEnumerable,而不是一个对象的实例。当您将源设置为ReportItem的单个实例时,您不会传递它可以迭代以构造它的行的任何内容。

如果你做了必要的改变并且给了一个猛拉,你应该是金色的:)

答案 2 :(得分:0)

您可以使用选择索引更改方法

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?)