2013-03-09 10 views
11

Muszę związać Visibility z DataGridTemplateColumn z właściwością spoza DataGrid.ItemsSource, ponieważ muszę powiązać tę kolumnę we wszystkich wierszach z jedną właściwością wewnątrz ViewModel, ale o ile wiem, po prostu można powiązać tę wartość z coś wewnątrz ItemsSource lub należy użyć ElementStyle i EditingElementStyle ja już próbowałem ten kod:Jak powiązać DataGridTemplateColumn.Visibility z właściwością poza DataGrid.ItemsSource?

<DataGridTemplateColumn Header="post" 
         Visibility="{Binding DataContext.ProjectPostVisibility 
        , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/> 

i jestem pewien, że mój wiążący jest poprawna, ponieważ działa dobrze, gdy wiążę DataGridCell.Visibility jak poniżej:

<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 > 
+0

można pokazać jakiś kod? – AbZy

+0

@ AbZy: Dodałem kod powyżej. –

Odpowiedz

20

Twoje powiązanie jest poprawne, ale nie zadziała bezpośrednio z DataGridTemplateColumn, ponieważ nie ma go w drzewie wizualnym. Więc to nie dziedziczy DataContext.

Musisz powiązać kod DataGridTemplateColumn z tyłu. Here is a demo który pokazuje sposób robienia tego.

+0

AbZy: Bardzo dziękuję. Nie wiedziałem o tym i było to naprawdę interesujące! –

0

Dodaj setter w DataGridTemplateColumn.CellStyle i zrobione:

<Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/> 

Jeśli potrzebujesz więcej pomocy spojrzeć na moim przykładzie poniżej. Chcę, aby przycisk Usuń nie był widoczny na poziomie projektu. Najpierw trzeba upewnić się, że właściwość isVisible w widoku modelu

private System.Windows.Visibility _isVisible; 
    public System.Windows.Visibility isVisible 
    { 
     get { return _isVisible; } 
     set 
     { 
      if (_isVisible != value) 
      { 
       _isVisible = value; 
       OnPropertyChanged("isVisible"); 
      } 
     } 
    } 

Następnie:

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>