[英]WPF Datagrid RowDetailsTemplate visibility bound to a property
我正在使用帶有RowDetails面板的WPF Datagrid,其中RowDetailsVisibilityMode設置為“VisibleWhenSelected”,SelectionMode =“Extended”,以便可以選擇多行,從而顯示RowDetails,如下所示:
<dg:DataGrid x:Name="MyGrid"
ItemsSource="{Binding Path=MyItems}"
AutoGenerateColumns="True"
SelectionMode="Extended"
RowDetailsVisibilityMode="VisibleWhenSelected">
<dg:DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Text="Further Details..."/>
</DataTemplate>
</dg:DataGrid.RowDetailsTemplate>
...
</dg:DataGrid>
遺憾的是,對於此應用程序,在“選定”行上顯示行詳細信息並不直觀,客戶端希望單擊多個行上的復選框以顯示RowDetails窗格,還可以在網格中滾動選擇其他行。 換句話說,無論DataGrid上發生什么,都要修復顯示RowDetails的行。
因此,目前滾動關閉他們已打開的RowDetailsPanes。 我想要做的是在其中一個列中有一個復選框,並將RowDetails面板可見性綁定到此屬性,但我無法弄清楚如何執行此操作。 問題只是RowDetailsPane只對數據網格中的行選擇進行操作 - 是否可以以某種方式擴展以對我選擇的屬性進行操作?
先謝謝,威爾
查看WPF工具包源代碼,每個DataGridRow都有一個DetailsVisibility屬性。
我在第一列中放了一個按鈕(僅用於測試)。
<toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="buttonDetails" Content="Hello" ButtonBase.Click="Details_Click" />
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
單擊該按鈕時,找到單擊的行並切換屬性。
private void Details_Click(object sender, RoutedEventArgs e)
{
try
{
// the original source is what was clicked. For example
// a button.
DependencyObject dep = (DependencyObject)e.OriginalSource;
// iteratively traverse the visual tree upwards looking for
// the clicked row.
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
// if we found the clicked row
if (dep != null && dep is DataGridRow)
{
// get the row
DataGridRow row = (DataGridRow)dep;
// change the details visibility
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
}
catch (System.Exception)
{
}
}
我沒有通過數據綁定探索這樣做。
使用純XAML(+轉換器):
XAML:
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<ToggleButton
IsChecked="{Binding Path=DetailsVisibility,
RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
Converter={StaticResource _VisibilityToNullableBooleanConverter}}"
/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
轉換器:
public class VisibilityToNullableBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return (((Visibility)value) == Visibility.Visible);
}
else
{
return Binding.DoNothing;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool?)
{
return (((bool?)value) == true ? Visibility.Visible : Visibility.Collapsed);
}
else if (value is bool)
{
return (((bool)value) == true ? Visibility.Visible : Visibility.Collapsed);
}
else
{
return Binding.DoNothing;
}
}
}
如果您使用(優秀)Lambda轉換器庫,您可以保存額外的類。 此轉換器使用2個lambda表達式,第一個用於Convert,第二個用於ConvertBack,例如:
public static readonly IValueConverter VisibilityToBoolean =
ValueConverter.Create<Visibility, bool>(
(e => e.Value == Visibility.Visible),
(e => e.Value ? Visibility.Visible : Visibility.Collapsed));
然后XAML如下(注意使用這種方法時不需要StaticResources):
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<ToggleButton>
<ToggleButton.IsChecked>
<Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGridRow}}" Path="DetailsVisibility"
Converter="{x:Static lc40:Converters.VisibilityToBoolean}"/>
</ToggleButton.IsChecked>
</ToggleButton>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
Lambda轉換器可在此處獲得:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.