2013-03-09 17 views
11

Ho bisogno di associare il di un DataGridTemplateColumn a una proprietà al di fuori del DataGrid.ItemsSource, perché ho bisogno di associare questa colonna in tutte le righe di una proprietà all'interno del ViewModel, ma per quanto ne so è possibile legare questo a qualcosa dentro la ItemsSource o si dovrebbe usare ElementStyle e EditingElementStyle ho già provato questo codice:Come associare DataGridTemplateColumn.Visibility a una proprietà esterna a DataGrid.ItemsSource?

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

e sono sicuro che il mio legame è corretto perché funziona bene quando mi legano l'DataGridCell.Visibility come di seguito:

<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

Potete mostrare un po 'di codice? – AbZy

+0

@ AbZy: ho aggiunto del codice sopra. –

risposta

20

L'associazione è corretta, ma non funziona con DataGridTemplateColumn direttamente perché non si trova nell'albero visivo. Quindi non sta ereditando DataContext.

È necessario associare il codice DataGridTemplateColumn dal codice. Here is a demo che mostra un modo di farlo.

+0

AbZy: Grazie mille. Non lo sapevo, ed è stato davvero interessante! –

0

Aggiungere questo setter nel DataGridTemplateColumn.CellStyle e fatto:

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

Se avete bisogno di più aiuto un'occhiata al mio esempio qui sotto. Desidero che il pulsante Rimuovi non sia visibile a livello di progetto. Prima di tutto bisogna assicurarsi di avere una proprietà IsVisible nel vostro modello di vista:

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

Poi:

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> 

Problemi correlati