2015-02-04 2 views
1

У меня есть RadButton управление в RadGridView и его функциональность такая же, как кнопка переключения (для открытия вложенной опоры).Переключение кнопок не работает

<telerik:RadButton x:Name="expand" Width="20" Content="+" Tag="{Binding Mode=OneWay}" Click="btnExpand_Click" /> 

И "btnExpand_Click" функциональность

private void btnExpand_Click(object sender, RoutedEventArgs e) 
    { 
     RadButton btn = sender as RadButton; 
     if (btn.Content.Equals("+") && flagRowSelected == true) 
     { 
      flagRowSelected = false; 
      if (signButton != null) 
      { 

       signButton.Content = "+"; 
      } 
      btn.Content = "-"; 
      grd.RowDetailsVisibilityMode = Telerik.Windows.Controls.GridView.GridViewRowDetailsVisibilityMode.VisibleWhenSelected; 

     } 
     else 
     { 

      flagRowSelected = true; 
      btn.Content = "+"; 
      grd.RowDetailsVisibilityMode = Telerik.Windows.Controls.GridView.GridViewRowDetailsVisibilityMode.Collapsed; 

     } 
     signButton = btn; 
    } 

Я столкнулся две проблемы здесь.

1) Я выбираю любую строку явно, а затем нажимаю на кнопку "+". Этот код работает нормально, и его вложенная сетка становится видимой, но содержимое кнопки не изменяется до "-".

2) И если я не выберем какую-либо строку явно и нажмите на кнопку «+». Этот код не работает, и его вложенная сетка не становится видимой.

Любая помощь будет оценена по достоинству.

+0

Что такое «signButton»? Это просто сохранить состояние вашей кнопки, отображает ли она в настоящее время + или -? – Martin

+0

Его кнопка, в которой хранится состояние последней кнопки. Он сохраняет правильные значения. –

+0

Я использовал sdk dataGrid, и моя проблема решена сейчас. –

ответ

1

Ну, я вижу несколько проблем с кодом, не знаю, с чего начать. Начнем с signButton: вы устанавливаете его как последнее утверждение (и в какой-то момент даже устанавливаете его содержимое раньше), но вы его больше не читаете. Таким образом, нет смысла иметь signButton. И если вам нужно сохранить, расширяются ли RowDetails, почему бы не использовать bool?

Во-вторых: вы устанавливаете rowDetailsVisibility на VisibleWhenSelected поэтому, когда ни одна строка не выбрана, нажмите кнопку, чтобы не отобразить rowDetails.

В-третьих: Почему вы вообще используете RadButton? Вам нужна кнопка с двумя разными состояниями, поэтому ToggleButton кажется естественным выбором.

Из строки xaml, которую вы показываете, я полагаю, что вы предоставляете какой-то пользовательский шаблон для сетки, возможно, шаблон строки, поэтому я предполагаю, что вы можете использовать любой элемент управления для кнопки расширения RowDetails?

Хорошо, возможно, нет никакой реальной выгоды от использования ToggleButton, не уверен.

я изменил свой код, может быть, вы посмотрите на это и попробовать это:

private void btnExpand_Click(object sender, RoutedEventArgs e) 
{ 
    ButtonBase btn = sender as ButtonBase; 
    if (btn.Content.Equals("+")) 
    { 
     btn.Content = "-"; 
     grd.RowDetailsVisibilityMode = 
      GridViewRowDetailsVisibilityMode.VisibleWhenSelected; 
     var correspondingRow = btn.GetAncestor<GridRow>(); 
     correspondingRow.Selected = true; 

    } 
    else 
    { 

     btn.Content = "+"; 
     grd.RowDetailsVisibilityMode = GridViewRowDetailsVisibilityMode.Collapsed; 

    } 
} 

Поиск предка определенного типа:

public static class ControlExtensions 
{ 
    public static TAncestor GetAncestor<TAncestor>(this DependencyObject subElement) 
     where TAncestor : DependencyObject 
    { 
     return subElement.GetAncestor<TAncestor>(potentialAncestorToStopTheSearch: null); 
    } 

    public static TAncestor GetAncestor<TAncestor>(this DependencyObject subElement, UIElement potentialAncestorToStopTheSearch) 
     where TAncestor : DependencyObject 
    { 
     DependencyObject parent; 
     for (DependencyObject subControl = subElement; subControl != null; subControl = parent) 
     { 
      if (subControl is TAncestor) return (TAncestor) subControl; 

      if (object.ReferenceEquals(subControl, potentialAncestorToStopTheSearch)) return null; 


      parent = VisualTreeHelper.GetParent(subControl); 
      if (parent == null) 
      { 
       FrameworkElement element = subControl as FrameworkElement; 
       if (element != null) 
       { 
        parent = element.Parent; 
       } 
      } 
     } 
     return null; 
    } 
} 
+0

Хорошо. Давайте начнем с 2-й точки, когда я нажимаю кнопку в строке, не выбрана ли эта строка автоматически? –

+0

Не следует ли сначала найти соответствующую строку, а затем сделать ее видимой? –

+0

Ответьте на свой первый комментарий: это зависит от элемента управления GridView. DataGrid (предоставленный microsoft внутри базовых библиотек для Silverlight) автоматически выберет любую строку при нажатии кнопки внутри строки. Я не знаю поведение telerik GridView. У вас есть один в своем пользовательском интерфейсе, почему бы не попробовать его и не щелкнуть по кнопке и посмотреть, будет ли строка выделена? – Martin

Смежные вопросы