我有一个绑定到PagedCollectionView的DataGrid,底层集合可能不包含任何项目。当发生这种情况时,DataGrid根本不呈现,没有列标题或任何内容,并且当DataGrid随后重新绑定到另一个包含某些项的PagedCollectionView时会导致系统错误
System.ArgumentException:值有 不在预期的范围内。
在 MS.Internal.XcpImports.MethodEx(IntPtr的 ptr,String name,CValue [] cvData)
在 MS.Internal.XcpImports.MethodEx(DependencyObject的 obj,String name)at MS.Internal.XcpImports.UIElement_UpdateLayout(的UIElement 元件)...
或
消息:Silverlight应用程序中的未处理错误
代码:4004
类别:ManagedRuntimeError
消息:System.ArgumentException:值不在预期范围内
在MS.Internal.XcpImports.CheckHResult(UInt32 hr)
在MS.Internal.XcpImports.Collection_InsertValue [T](PresentationFrameworkCollection 1集合,UInt32索引,CValue值)
在MS.Internal.XcpImports.Collection_InsertDependencyObject [T](PresentationFrameworkCollection 1集合,UInt32索引,DependencyObject值)
在System.Windows.PresentationFrameworkCollection 1.InsertDependencyObject(Int32 index,DependencyObject value)
在System.Windows.Controls.UIElementCollection.InsertInternal(Int32索引,UIElement值)
在System.Windows.PresentationFrameworkCollection 1.Insert(Int32 index,T value)
在System.Windows.Controls.DataGrid.InsertDisplayedColumnHeader(DataGridColumn dataGridColumn)
在System.Windows.Controls.DataGrid.OnInsertedColumn_PreNotification(DataGridColumn insertedColumn)
在System.Windows.Controls.DataGridColumnCollection.InsertItem(Int32 columnIndex,DataGridColumn dataGridColumn)
在System.Collections.ObjectModel.Collection 1.Insert(Int32 index,T item)
在System.Windows.Controls.DataGridColumnCollection.EnsureRowGrouping(Boolean rowGrouping)
在System.Windows.Controls.DataGrid.EnsureRowGroupSpacerColumn()
在System.Windows.Controls.DataGrid.RefreshRows(Boolean recycleRows,Boolean clearRows)
在System.Windows.Controls.DataGrid.RefreshRowsAndColumns(布尔clearRows)
在System.Windows.Controls.DataGrid.MeasureOverride(Size availableSize)
在System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Single inWidth,Single inHeight,Single& outWidth,Single& outHeight)
行:54
Char:13
代码:0
我认为这是因为DataGrid缺少它应该具有的指针(但说实话我真的不知道,因为我没有查看它)。
系统异常显然是一个问题,我希望它不会发生。但是当集合中没有项目时使UI看起来很好是一个业务需求,我认为修复UI以在集合为空时显示一些不错的东西可能只是让我解决系统异常。
那么可以在Silverlight 3 DataGrid中显示消息或默认行吗?
我见过Jonathan Shen's answer,但我想知道现在是否有更容易/更简单/内置的方式,因为他的回答早于Silverlight 3.我也有一个问题,View必须创建,在示例中,Person集合&宾语。我的视图不了解ViewModel,所以为了实现Jonathan的解决方案,我还必须在视图中实现一个辅助人员 - 而不是世界末日,但它似乎有点hacky。
在将可能为空的集合绑定到Silverlight DataGrid时,是否有人有更好的解决方案来显示好东西?
答案 0 :(得分:4)
我会通过关闭数据网格的可见性和说明文本块的可见性来实现此目的。您可以使用绑定和转换器执行此操作:
<强>转换器:强>
public class ObjectToVisibilityConverter : IValueConverter
{
public bool Negate { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!Negate)
{
return (value == null) ? Visibility.Collapsed : Visibility.Visible;
}
else
{
return (value == null) ? Visibility.Visible : Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
<强> XAML:强>
<UserControl.Resources>
<xmlnsref:ObjectToVisibilityConverter x:Key="ObjectToVisibilityConverter" />
<xmlnsref:ObjectToVisibilityConverter Negate="True" x:Key="ReversedObjectToVisibilityConverter" />
</UserControl.Resources>
<StackPanel>
<data:dataGrid Visibility="{Binding MyDataSetObject, Converter={StaticResource ObjectToVisibilityConverter}}">
... />
<TextBlock Text="No results found."
Visibility="{Binding MyDataSetObject, Converter={StaticResource ReversedObjectToVisibilityConverter}}"> />
</StackPanel>
如果MyDataSetObject对象为null,这将隐藏网格(并显示文本框),如果不为null,则隐藏反之亦然(注意转换器上的 Negate 属性将反转可见性)< / p>
答案 1 :(得分:2)
您可以使用如下参数:
,而不是在xaml中定义2个单独的转换器Visibility="{Binding MissingDocList, Converter={StaticResource ObjectToVisibilityConverter}, ConverterParameter=False}"
和
if (!System.Convert.ToBoolean(parameter))
转换器类中的。 只是一个想法...