我正在尝试使用ToggleButton
设置和绑定,以更改DataGrid
中列的可见性。 I am following this post问题在于转换器永远不会触发,我也不知道为什么。
我的代码如下:
<DataGridTemplateColumn Header="My Header"
Visibility="{Binding IsChecked,
ElementName=AdvancedToggleButton,
Converter={StaticResource booleanToVisaulConverter}}" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- Elements removed for brevity-->
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
转换器是这个
<Page.Resources>
<local:BooleanToVisaulConverter x:Key="booleanToVisaulConverter" />
</Page.Resources>
后面的代码;
public class BooleanToVisaulConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool visibility = (bool)value;
return visibility ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility visibility = (Visibility)value;
return (visibility == Visibility.Visible);
}
}
编辑:@Breeze发现booleanToVisaulConverter
实际上没有指向BooleanToVisaulConverter
的错误。这已经修复但仍未解雇。要求提供ToggleButton代码;
<ToggleButton Name="AdvancedToggleButton" Content="Advanced" />
答案 0 :(得分:3)
几周前我遇到了同样的问题。我的解决方案如下:
首先,您必须实现一个包含datacontext的binding-proxy-class。这个类看起来像:
public class BindingProxy : Freezable
{
public static readonly DependencyProperty DataProperty = DependencyProperty.Register(
"Data", typeof (object), typeof (BindingProxy), new UIPropertyMetadata(null));
public object Data
{
get { return GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
然后定义Page-Resources,您可以创建此绑定代理的实例,如:
<namespaceOfProxy:BindingProxy Data="{Binding}" x:Key="proxy"/>
然后,您可以使用以下代码将Visiblity
的{{1}}绑定到viewmodel中的属性:
DataGridTemplateColumn
这适用于将可见性绑定到viewmodel中的属性。在你的情况下,我会将the的状态绑定到viewmodel中的属性。
答案 1 :(得分:0)
事实证明,如果你将Visibility设置为标题和列的单元格,它仍然存在并且没有完全隐藏......经过一些挖掘(之前从未使用过数据网格:))I&#39 ; ve发现您可以访问DataGrid对象中的列,因此最快的工作方式是:
XAML
<ToggleButton Name="AdvancedToggleButton"
Content="Advanced"
Click="AdvancedToggleButton_Click" />
背后的代码
private void AdvancedToggleButton_Click(object sender, RoutedEventArgs e)
{
var newVisibility = (bool)(sender as ToggleButton).IsChecked ?
Visibility.Visible : Visibility.Collapsed;
this.theDataGrid.Columns[0].Visibility = newVisibility;
}
当然,如果您要在实际代码中使用固定索引,您必须实现一些逻辑来获取相应的列。