我有一个数据网格,我想在单击一行时显示详细信息,并在用户再次点击时隐藏它。
DataGridRowDetailsVisibilityMode.VisibleWhenSelected
仅允许一次显示一个详细信息行。其他选项似乎是All或Nothing。
解决方法是什么?
谢谢!
答案 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;
}
希望这有帮助。