C#Datagrid中的多个ItemSources

时间:2017-03-29 12:47:12

标签: c# xaml

我曾经拥有以下DataGrid:

<sdk:DataGrid x:Name="dataGrid" Grid.Row="0" Style="{StaticResource tableStyle}" ItemsSource="{Binding PagedView}">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Binding="{Binding Path=EventID, StringFormat='#{0}'}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Width="Auto" Header="EventID"/>
        <sdk:DataGridTextColumn Binding="{Binding EventDescription}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Width="Auto" Header="Description"/>
        <sdk:DataGridTextColumn Binding="{Binding EventStatu.Description}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Width="Auto" Header="Status"/>
        <sdk:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" SortMemberPath="Detector.Track.TrackName" Width="Auto" Header="Track">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="3,0">
                        <TextBlock Text="{Binding Path=Detector.Track.TrackName}" />
                        <TextBlock Text="{Binding Path=Detector.DetectorID, StringFormat=' ({0})'}" />
                    </StackPanel>
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>             
        </sdk:DataGridTemplateColumn>
        <sdk:DataGridTextColumn Binding="{Binding StartedOn.LocalDateTime, StringFormat={StaticResource DateFormat}}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Header="Started" Width="Auto"/>
        <sdk:DataGridTextColumn Binding="{Binding EndedOn.LocalDateTime, FallbackValue=N/A, StringFormat={StaticResource DateFormat}}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Header="Stopped" Width="Auto"/>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

和.cs

private void EventsLoaded(LoadOperation<Event> loadOperation)
{
    events.Clear();

    if(loadOperation.HasError)
    {
        loadOperation.MarkErrorAsHandled();
    }
    else
    {
        foreach (Event evnt in loadOperation.Entities)
        {
            events.Add(evnt);//For adding the whole event row
        }
    }
}

这给了我以下行:

EventID     Description     Status      Track       Started       Stopped

现在这一切都正确无误。但是,我想添加一个额外的列,其中包含已开始已停止之间的时间差异。

为此,我添加了以下内容:

在设计师中我添加了:

<sdk:DataGridTextColumn Binding="{Binding Path=timediff}" CanUserSort="True" CanUserReorder="True" CanUserResize="True" Header="Duration" Width="Auto"/>

在.Cs中我添加了:

string Difference = string.Empty;
TimeSpan duration = evnt.EndedOn.Value.Subtract(evnt.StartedOn);
if (duration.Days > 0)
{
    Difference += string.Format("Event duration: {0} day(s) and {1} hour(s) \r\n",
    duration.Days, duration.Hours);
}
else if (duration.Hours > 0)
{
    Difference += string.Format("Event duration: {0} hour(s) and {1} minute(s) \r\n",
    duration.Hours, duration.Minutes);
}
else
{
    Difference += string.Format("Event duration: {0} minute(s) \r\n",
    duration.Minutes);
}

List<TimeInfo> timeinfo = new List<TimeInfo>();
timeinfo.Add(new TimeInfo() { timediff = Difference });

public class TimeInfo
{
    public string timediff { get; set; }
}

现在,当我再次运行程序时,它会显示以下列:

EventID     Description     Status      Track       Started       Stopped       Duration 

持续时间外,其他所有内容均已填写。 当我在我的.Cs代码中添加以下内容时:

dataGrid.ItemsSource = timeinfo;

并运行应用程序,它只填写持续时间字段,并将其余部分留空。

我是否有可能在1个网格中显示两个项目源?

1 个答案:

答案 0 :(得分:0)

我解决了你的问题。我怎么理解你的ItemSource不能读取差异属性。在第一种情况下,您可以访问“dataGrid”,其中您说他的ItemSource是“timeinfo”,在第二种情况下,您有“PagedView”列表,您的财产在哪里。

第一个建议是指定MVVM概念,这意味着(例如):

<ListView ItemsSource="{Binding PagedView}" DataContext="{Binding YourClassName}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <GridViewColumn Width="200">
                <Grid>
                    <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30"/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="30"/>
                    </Grid.ColumnDefinitions>
                     <TextBlock  Grid.Row="0" Grid.Column="1" Text="{Binding EventID}">
                     <TextBlock  Grid.Row="0" Grid.Column="2" Text="{Binding EventDescription}">
                </Grid>
            </GridViewColumn>
        </DataTemplate>
    </ListView.ItemTemplate>    
</ListView>

我以你的第一个和secon Colums为例。但是为了休息,你可以在ColumnDefinition中添加更多colums,然后向下定义更多TextBlocks。那就是你的查看。类YourClassName代表您的ListView 视图模型

public class YourClassName {

    public YourClassName(string eventId, string eventDescr)
    {
        EventID = eventId;
        EventDescription = eventDescr;
    }
    private string mEventID;
    public string EventID{
        get { return mEventID; }
        set { SetProperty(ref mEventID, value); }
    }

            private string mEventDescription;
    public string EventDescription{
        get { return mEventDescription; }
        set { SetProperty(ref mEventDescription, value); }
    }
}

现在你需要你班级的财产:

private List<YourClassName> mPagedView;
public List<YourClassName> PagedView {
    get { return mPagedView; }
    set { SetProperty(ref mPagedView, value); }
}

在MainViewModel中,例如在构造函数中,您可以创建类的实例:

PageView = new List<YourClassName>();
PageView.Add("MYID","Blabla");

在这种情况下,你要避免x:名字是公共的,我只在必须时使用它。

我希望它至少有一点帮助。

问候!