Кнопка «Развернуть / Свернуть» в сетке данных Silverlight - PullRequest
5 голосов
/ 08 марта 2011

Я использую RowDetailsTemplate в DataGrid Silverlight, чтобы показать детали строки. Установка RowDetailsVisibilityMode = "VisibleWhenSelected" не обеспечивает хорошего взаимодействия с пользователем (можно развернуть только одну строку за раз, все строки не могут быть свернуты). Какой самый простой способ добавить кнопку «Развернуть / Свернуть» в каждой строке, чтобы строки можно было развернуть / свернуть независимо?

1 Ответ

4 голосов
/ 08 марта 2011

Я хотел написать в блоге свое решение для этого.Я установил для сетки RowDetailsVisibilityMode значение Collapsed и использую DataGridTemplateColumn со стилем ToggleButton, чтобы переключать видимость строки.

Кнопка переключения может быть подключена для переключения видимости строки с помощью привязки или с помощью TriggerAction.
Привязка должна выполняться в коде, поскольку вы пытаетесь привязать ToggleButton.IsChecked к элементу.который генерируется и не существует в XAML (DataGridRow.DetailsVisibility) (это будет разрешено в SL5 с более сильной привязкой RelativeSource)

Для обоих решений у меня есть этот метод расширения в вспомогательном классе:

    /// <summary>
    /// Walk up the VisualTree, returning first parent object of the type supplied as type parameter
    /// </summary>
    public static T FindAncestor<T>(this DependencyObject obj) where T : DependencyObject
    {
        while (obj != null)
        {
            T o = obj as T;
            if (o != null)
                return o;

            obj = VisualTreeHelper.GetParent(obj);
        }
        return null;
    }

Для метода привязки кода:

    private void ToggleButton_Loaded(object sender, RoutedEventArgs e)
    {
        ToggleButton button = sender as ToggleButton;
        DataGridRow row = button.FindAncestor<DataGridRow>();  //Custom Extension
        row.SetBinding(DataGridRow.DetailsVisibilityProperty, new Binding() 
        {   
            Source = button, 
            Path = new PropertyPath("IsChecked"), 
            Converter = new VisibilityConverter(), 
            Mode = BindingMode.TwoWay 
        });
    }

Для метода TriggerAction:

public class ExpandRowAction : TriggerAction<ToggleButton>
{
    protected override void Invoke(object o)
    {
        var row = this.AssociatedObject.FindAncestor<DataGridRow>();
        if (row != null)
        {
            if (this.AssociatedObject.IsChecked == true)
                row.DetailsVisibility = Visibility.Visible;
            else
                row.DetailsVisibility = Visibility.Collapsed;
        }
    }
}

Затем в XAML:

<sdk:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ToggleButton Style="{StaticResource PlusMinusToggleButtonStyle}" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <behaviors:ExpandRowAction/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ToggleButton>
    </DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...