#silverlight #telerik #radgridview
#silverlight #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=»{Заголовок привязки}» Основная ошибка в списке: значение не попадает в ожидаемый диапазон.
Я не уверен, почему это происходит. Я постараюсь опубликовать остальную часть ошибки ниже. У кого-нибудь еще это работает или есть какие-либо идеи, в чем дело?
System.InvalidOperationException
При попытке отобразить текущий проект silverlight на поверхности разработки возникло необработанное исключение. Чтобы диагностировать этот сбой, попробуйте запустить проект в обычном браузере, используя silverlight developer runtime. at
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, EffectiveValueEntryamp; newEntry, Object newValue) at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntryamp; 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)
Ответ №1:
Мне удалось воспроизвести вашу проблему, но я получаю другое исключение («Элемент уже является дочерним элементом другого элемента»). Я думаю, что причина может быть той же, поэтому посмотрите, поможет ли это.
Небольшая отладка показывает, что когда SelectionMode
установлено Multiple
Header
GridViewSelectColumn
значение, значение становится a 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>
Комментарии:
1. Tqvm 4 ответ .. извините, я только что понял это post..it должно быть, это первый раз, когда я использую StackOverflow там .. еще раз спасибо за помощь 4
2. @MuhammadMahmud, конечно. Приветствия!