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;
}
Надеюсь, это поможет.