Значение не попадает в ожидаемый диапазон привязки ошибок в Telerik RadGridView

Я следую примеру, опубликованному Telerik, о том, как отображать / скрывать столбцы в их элементе управления RadGridView, как показано здесь:

  <StackPanel x:Name="CustomizeGrid" Background="Transparent" Orientation="Horizontal">
    <ListBox ItemsSource="{Binding Columns, ElementName=WorklistGridView}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Header}" IsChecked="{Binding IsVisible, Mode=TwoWay}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <telerik:RadGridView x:Name="WorklistGridView" AutoGenerateColumns="False" RowIndicatorVisibility="Collapsed" IsReadOnly="True" SelectionMode="Multiple" 
                     CanUserSelect="False" IsSynchronizedWithCurrentItem="False" ItemsSource="{Binding Mode=OneWay}" IsFilteringAllowed="True">
        <telerik:RadGridView.Columns>
            <telerik:GridViewSelectColumn x:Name="Select" IsResizable="False" />
            <telerik:GridViewDataColumn Header="Status" DataMemberBinding="{Binding OrderStatusDescription}"/>
            <telerik:GridViewDataColumn Header="Patient Name" DataMemberBinding="{Binding PatientName}"/>

Но пример не компилируется правильно. Проблема здесь: CheckBox `Content =" {Binding Header} "Основная ошибка в списке: значение не попадает в ожидаемый диапазон.

Я не уверен, почему это происходит. Я постараюсь опубликовать остальную часть ошибки ниже. У кого-нибудь еще это работает, или есть идеи, что случилось?

System.InvalidOperationException

Произошла необработанная исключительная ситуация при попытке визуализации текущего проекта Silverlight в области конструктора. Чтобы диагностировать этот сбой, попробуйте запустить проект в обычном браузере, используя среду выполнения Silverlight Developer. в

Microsoft.Windows.Design.Platform.SilverlightViewProducer.OnUnhandledException(Object sender, ViewUnhandledExceptionEventArgs e) at Microsoft.Expression.Platform.Silverlight.SilverlightPlatformSpecificView.OnUnhandledException(Object sender, ViewUnhandledExceptionEventArgs args) at Microsoft.Expression.Platform.Silverlight.Host.SilverlightImageHost.<>c_DisplayClass1.b_0(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

System.ArgumentException Value does not fall within the expected range. at MS.Internal.XcpImports.CheckHResult(UInt32 hr) at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh) at MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj) at System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value) at System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue) at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation) at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp) at System.Windows.Data.BindingExpression.SendDataToTarget() at System.Windows.Data.BindingExpression.SourceAcquired() at System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(Object sender, DataContextChangedEventArgs e) at System.Windows.Data.BindingExpression.DataContextChanged(Object sender, DataContextChangedEventArgs e) at System.Windows.DataContextChangedEventHandler.Invoke(Object sender, DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnTreeParentUpdated(DependencyObject newParent, Boolean bIsNewParentAlive) at System.Windows.DependencyObject.UpdateTreeParent(IManagedPeer oldParent, IManagedPeer newParent, Boolean bIsNewParentAlive, Boolean keepReferenceToParent) at MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate(IntPtr oldParentElement, IntPtr parentElement, IntPtr childElement, Byte bIsParentAlive, Byte bKeepReferenceToParent, Byte bCanCreateParent)

person MuhammadMahmud    schedule 17.06.2014    source источник


Ответы (1)


Мне удалось воспроизвести вашу проблему, но я получаю другое исключение («Элемент уже является потомком другого элемента»). Я думаю, причина может быть та же, так что посмотрим, поможет ли это.

Небольшая отладка показывает, что когда SelectionMode установлен в Multiple, тогда Header из GridViewSelectColumn становится CheckBox. Это означает, что вы пытаетесь добавить один и тот же CheckBox как в заголовок столбца, так и в содержимое CheckBox внутри вашего ListBox. Просто попробуйте удалить SelectionMode и посмотрите, есть ли у вас такая же проблема или нет.

Если это так, то вы можете исправить проблему, добавив к CheckBox.Content привязке преобразователь, который проходит только через строки. Например:

public class HeaderConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
     if (value is string)
        return value;

     return string.Empty;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
     throw new NotImplementedException();
  }
}

Затем в XAML:

<ListBox ItemsSource="{Binding Columns, ElementName=WorklistGridView}">
    <ListBox.Resources>
        <local:HeaderConverter x:Key="headerConverter" />
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Header, Converter={StaticResource headerConverter}}"
                      IsChecked="{Binding IsVisible, Mode=TwoWay}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
person icebat    schedule 17.06.2014
comment
Tqvm 4 ответ ... извините, я только что понял этот пост ... должно быть, я впервые использую StackOverflow там ... еще раз спасибо 4 за помощь - person MuhammadMahmud; 10.10.2017
comment
@MuhammadMahmud, конечно. Ваше здоровье! - person icebat; 10.10.2017