2013-03-09 5 views
11

Ich muss die Visibility einer DataGridTemplateColumn an eine Eigenschaft außerhalb der DataGrid.ItemsSource binden, weil ich diese Spalte in allen Zeilen an eine Eigenschaft innerhalb der ViewModel binden muss, aber soweit ich weiß, können Sie nur daran binden etwas in der ItemsSource oder sollten Sie ElementStyle und EditingElementStyle ich bereits diesen Code versucht haben, verwenden:Wie binden Sie DataGridTemplateColumn.Visibility an eine Eigenschaft außerhalb von DataGrid.ItemsSource?

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

und ich bin sicher meine Bindung korrekt ist, weil es gut funktioniert, wenn ich die DataGridCell.Visibility wie unten binden:

<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

Können Sie etwas Code zeigen? – AbZy

+0

@ AbZy: Ich habe oben einen Code hinzugefügt. –

Antwort

20

Ihre Bindung ist korrekt, aber sie funktioniert nicht direkt mit DataGridTemplateColumn, da sie nicht im visuellen Baum enthalten ist. So ist es nicht DataContext inherting.

Sie müssen die DataGridTemplateColumn von Code hinter binden. Here is a demo das zeigt eine Möglichkeit, es zu tun.

+0

AbZy: Vielen Dank. Ich wusste das nicht, und es war wirklich interessant! –

0

Fügen Sie diese Setter in der DataGridTemplateColumn.CellStyle und getan:

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

Wenn Sie weitere Hilfe Blick auf mein Beispiel unten benötigen. Ich möchte, dass die Schaltfläche Entfernen auf Projektebene nicht sichtbar ist. Zuerst müssen Sie sicherstellen, dass Sie eine isVisible Eigenschaft Ihrer Ansicht nach Modell haben:

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

Dann:

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>