Как привязать DataGridTemplateColumn.Visibility к свойству за пределами DataGrid.ItemsSource?
Мне нужно привязать Visibility
к DataGridTemplateColumn
к свойству вне DataGrid.ItemsSource
, потому что мне нужно связать этот столбец во всех строках с одним свойством внутри ViewModel
, но в качестве как я знаю, вы просто можете связать это с чем-то внутри ItemsSource
, или вы должны использовать ElementStyle
и EditingElementStyle
Я уже пробовал этот код:
<DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.ProjectPostVisibility
, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
И я уверен, что моя привязка правильная, потому что она отлично работает, когда я привязываю DataGridCell.Visibility
, как показано ниже:
<DataGridTemplateColumn Header="post">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Visibility" Value="{Binding DataContext.ProjectPostVisibility,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
</Style>
</DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn >
Ответы
Ответ 1
Ваша привязка верна, но она не будет работать с DataGridTemplateColumn
напрямую, потому что она не в визуальном дереве. Поэтому он не наследует DataContext
.
Вам нужно привязать DataGridTemplateColumn
от кода. Вот демонстрация, которая показывает способ сделать это.
Ответ 2
Добавьте этот сеттер в DataGridTemplateColumn.CellStyle и выполните:
<Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
Если вам нужна дополнительная помощь, посмотрите мой пример ниже.
Я хочу, чтобы кнопка "Удалить" не отображалась на уровне проекта. Сначала вы должны убедиться, что у вас есть свойство isVisible в вашей модели просмотра:
private System.Windows.Visibility _isVisible;
public System.Windows.Visibility isVisible
{
get { return _isVisible; }
set
{
if (_isVisible != value)
{
_isVisible = value;
OnPropertyChanged("isVisible");
}
}
}
Тогда:
if (isProj == false)
this.model.isVisible = Visibility.Visible;
else
this.model.isVisible = Visibility.Collapsed;
XAML:
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate >
<DataTemplate >
<Button x:Name="btnRemove" Content="X">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="FontSize" Value="50" />
</Style>
</Button.Style>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Red"/>
<Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
</Style>
</DataGridTemplateColumn.CellStyle>