Можно ли отобразить сообщение или строку по умолчанию в сетке данных Silverlight 3 - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть DataGrid, который связан с PagedCollectionView, и базовая коллекция может не содержать элементов. Когда это происходит, DataGrid не визуализируется вообще, без заголовков столбцов или чего-либо, и когда DataGrid затем повторно привязывается к другому PagedCollectionView, который содержит некоторые элементы, это вызывает системную ошибку

System.ArgumentException: значение делает не попадает в ожидаемый диапазон.
в MS.Internal.XcpImports.MethodEx (IntPtr ptr, строковое имя, CValue [] cvData)
в MS.Internal.XcpImports.MethodEx (DependencyObject obj, строковое имя) в MS.Internal.XcpImports.UIElement_UpdateLayout (UIElement элемент) ...

или

Сообщение: необработанная ошибка в приложении Silverlight Код: 4004
Категория: ManagedRuntimeError
Сообщение: System.ArgumentException: значение не попадает в ожидаемый диапазон.
в MS.Internal.XcpImports.CheckHResult (UInt32 ч)
в 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, значение DependencyObject)
в System.Windows.Controls.UIElementCollection.InsertInternal (индекс Int32, значение UIElement)
в System.Windows.PresentationFrameworkCollection 1.Insert (индекс Int32, значение T)
в System.Windows.Controls.DataGrid.InsertDisplayedColumnHeader (DataGridColumn dataGridColumn)
в System.Windows.Controls.DataGrid.OnInsertedColumn_PreNotification (DataGridColumn InsertColumn)
в System.Windows.Controls.DataGridColumnCollection.InsertItem (Int32 columnIndex, DataGridColumn dataGridColumn)
at System.Collections.ObjectModel.Collection 1.Insert (индекс Int32, элемент T)
at System.Windows.Controls.DataGridColumnCollection.EnsureRowGrouping (Boolean rowGrouping)
в System.Windows.Controls.DataGrid.EnsureRowGroupSpacerColumn ()
в System.Windows.Controls.DataGrid.RefreshRows (логическое recycleRows, логическое clearRows)
at System.Windows.Controls.DataGrid.RefreshRowsAndColumns (Boolean clearRows)
at System.Windows.Controls.DataGrid.MeasureOverride (Size availableSize)
в System.Windows.FrameworkElement.MeasureOverride (IntPtr nativeTarget, одинарный inWidth, одинарный inHeight, одиночный и внешний, одиночный и внешний)

Линия: 54
Char: 13
Код: 0

, что, как я полагаю, вызвано тем, что в DataGrid отсутствует указатель, который должен иметь (но, если честно, я действительно понятия не имею, поскольку я не изучал его).

Системное исключение, очевидно, является проблемой, и я бы хотел, чтобы этого не произошло. Но сделать пользовательский интерфейс красивым, когда в коллекции нет элементов, является бизнес-требованием, и я полагаю, что исправление пользовательского интерфейса для отображения чего-то приятного, когда коллекция пуста, может просто дать мне обходной путь для исключения системы.

Так возможно ли отобразить сообщение или строку по умолчанию в сетке данных Silverlight 3?

Я видел Ответ Джонатана Шена , но мне было интересно, есть ли более простой / простой / встроенный способ в наши дни, так как его ответ предшествовал Silverlight 3. У меня также есть проблема с View в этом примере необходимо создать коллекцию Person и объект. Мои представления не имеют представления о ViewModel, поэтому для реализации решения Джонатана мне также нужно было бы внедрить в View вторичное лицо - не конец света, но это кажется немного хакерским.

У кого-нибудь есть лучшее решение для отображения чего-то приятного при связывании потенциально пустой коллекции с сеткой данных Silverlight?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2009

Я бы сделал это, отключив видимость сетки данных и видимость, скажем, текстового блока. Вы можете сделать это с привязкой и конвертером:

Преобразователь:

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 в преобразователе, которое обратит видимость)

2 голосов
/ 08 апреля 2010

Вместо того, чтобы определять 2 отдельных конвертера в xaml, вы можете использовать такой параметр:

Visibility="{Binding MissingDocList, Converter={StaticResource ObjectToVisibilityConverter}, ConverterParameter=False}"

и

 if (!System.Convert.ToBoolean(parameter))

в классе конвертеров. Просто мысль ...

...