Сетка данных Silverlight, показать детали для нескольких строк, но не для всех - PullRequest
1 голос
/ 07 июля 2010

У меня есть сетка данных, в которой я хотел бы показать подробности при щелчке строки, и скрыть ее при повторном нажатии.

DataGridRowDetailsVisibilityMode.VisibleWhenSelected

позволяет отображать только одну строку подробностей за раз,Другие варианты: «Все или ничего».

Что такое обходной путь?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 июля 2010

Вы можете сами управлять государством.

Имейте видимость детали, привязанной к свойству базового объекта, и просто переключайте значение этого свойства, когда строка выбрана или снята.

0 голосов
/ 08 июля 2010

OK. На основании запроса на код ...

Вот XAML для гипотетической сетки:

        <data:DataGrid x:Name="TheGrid" AutoGenerateColumns="False">
        <data:DataGrid.Columns>
            <data:DataGridTemplateColumn Header="Items">
                <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid MouseLeftButtonDown="Item_MouseLeftButtonDown">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Text="{Binding Title}" Margin="5"/>
                            <TextBlock Grid.Column="1" Text="{Binding Desc}" Visibility="{Binding DescVisibility}"  Margin="5"/>
                        </Grid>
                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>
            </data:DataGridTemplateColumn>
        </data:DataGrid.Columns>
    </data:DataGrid>

Обратите внимание на использование DataTemplate для столбца и включение двух текстовых элементов. Второй TextBlock имеет видимость, связанную с DescVisibility. Также обратите внимание на событие щелчка в сетке.

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

        public class AnItem : INotifyPropertyChanged
    {
        public AnItem(string title, string desc)
        {
            Title = title;
            Desc = desc;
        }

        public string Title { get; set; }
        public string Desc { get; set; }


        private bool _toggleState { get; set; }
        public bool ItemToggled
        {
            get { return _toggleState; }
            set
            {
                if (_toggleState != value)
                {
                    _toggleState = value;
                    OnPropertyChanged("ItemToggled");
                    OnPropertyChanged("DescVisibility");
                }
            }
        }

        public Visibility DescVisibility
        {
            get
            {
                if (_toggleState)
                    return Visibility.Visible;
                else
                    return Visibility.Collapsed;
            }
        }

        #region INotifyPropertyChanged implementation

        /// <summary>
        /// This event is fired when any of the property values change on this object
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Raises the PropertyChanged event for the passed in property
        /// </summary>
        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion INotifyPropertyChanged Implementation
    }

Этот объект реализует INotifyPropertyChanged, так что он хорошо работает с привязкой и имеет два специальных свойства. Логическое значение для чтения / записи для поддержания состояния и значение видимости только для чтения, которое просто избавляет нас от использования в привязке логического / преобразователя видимости, поскольку я ленив.

Последняя часть - это обработчик события click, который довольно прост:

        private void Item_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (((Grid)sender).DataContext is AnItem)
        {
            AnItem item = ((Grid)sender).DataContext as AnItem;
            item.ItemToggled = !item.ItemToggled;
        }
    }

Наконец, только для полноты, вот код для установки источника элемента для сетки:

        public List<AnItem> TheItems = new List<AnItem>();

    public MainPage()
    {
        InitializeComponent();

        TheItems.Add(new AnItem("Title1", "The description for the first item"));
        TheItems.Add(new AnItem("Title2", "The description for the second item"));
        TheItems.Add(new AnItem("Title3", "Maybe I should be more imaginative with descriptions"));
        TheGrid.ItemsSource = TheItems;
    }

Надеюсь, это поможет.

0 голосов
/ 07 июля 2010

Может быть возможно установить для DataGridRowDetailsVisibilityMode значение Visible и изменить шаблон сведений о строке, чтобы он был скрыт или расширен в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...