Silverlight数据网格,显示多行的详细信息,但不是全部

时间:2010-07-06 20:16:36

标签: silverlight datagrid

我有一个数据网格,我想在单击一行时显示详细信息,并在用户再次点击时隐藏它。

DataGridRowDetailsVisibilityMode.VisibleWhenSelected

仅允许一次显示一个详细信息行。其他选项似乎是All或Nothing。

解决方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

可以将DataGridRowDetailsVisibilityMode设置为Visible,并将行详细信息模板更改为隐藏或扩展,具体取决于您需要的条件。

答案 1 :(得分:0)

你可以自己管理这个州。

在底层对象上具有绑定到属性的细节的可见性,并在选择或取消选择行时简单地切换此属性的值。

答案 2 :(得分:0)

行。基于代码请求......

以下是假设网格的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绑定。另请注意网格上的click事件。

以下是我们绑定到每一行的数据对象的代码:

        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;
    }

希望这有帮助。