【问题标题】:C# Multiple ItemSources in Datagrid数据网格中的 C# 多个 ItemSource
【发布时间】:2017-03-29 12:47:11
【问题描述】:

我曾经有以下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

现在这一切都正确且有效。但是,我想添加一个额外的列,其中包含 StartedStopped 之间的时间差。

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

在我添加的设计器中:

<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 个网格中显示两个 itemsource?

【问题讨论】:

标签: c# xaml


【解决方案1】:

我解决了你的问题。我是如何理解您的 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>

我以您的第一个和第二个 Colums 为例。但是为了休息,你不能在 ColumnDefinition 中添加更多的列并向下定义更多的 TextBlocks。这就是您的视图。类 YourClassName 代表您的 ListView View-Model

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 中,例如在 Constructor 中创建您的类的实例:

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

在这种情况下,您避免 x:Name 是公开的,我只在必须时使用它。

我希望它至少有所帮助。

问候!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多