我曾经拥有以下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个网格中显示两个项目源?
答案 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:名字是公共的,我只在必须时使用它。
我希望它至少有一点帮助。
问候!