2010-10-25 226 views
0

如果我有以下DataGrid,我該如何將TemplateColumn的可見性綁定到ViewModel上的屬性?我在這裏的代碼是基於這個SO Question的建議,但沒有運氣。將DataGrid列綁定到ViewModel屬性

  <sdk:DataGrid Visibility="{Binding GridVisible}" DataContext="{Binding}" Grid.Row="1" ItemsSource="{Binding Path=BookSource}" x:Name="bookGrid" AutoGenerateColumns="False" IsReadOnly="True"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTemplateColumn Visibility="{Binding Path=DataContext.GridImgColumnVisible, ElementName=bookGrid}"> 
         <sdk:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Image Stretch="Fill" Source="{Binding Path=SmallImgURI}"></Image> 
          </DataTemplate> 
         </sdk:DataGridTemplateColumn.CellTemplate> 
        </sdk:DataGridTemplateColumn> 

        <sdk:DataGridTextColumn Header="Title" Width="*" Binding="{Binding CurrentBook.Title}" /> 
        <sdk:DataGridTextColumn Header="Published" Width="150" Binding="{Binding CurrentBook.Published, StringFormat=d}" /> 
       </sdk:DataGrid.Columns> 
      </sdk:DataGrid> 

編輯 - 我也試過:

<sdk:DataGridTemplateColumn Visibility="{Binding Path=DataContext.GridImgColumnVisible, ElementName=root}"> 

,我還添加了一個按鈕,我的實際控制人,並限定它的知名度,這個屬性沒有困難。

回答

3

它可以在WPF中實現,但Silverlight DataGrid是不同的。 Visibility屬性不是依賴項屬性(不能執行綁定),Columns不屬於VisualTree,不會繼承DataContext。

使用代碼隱藏,像這樣:

var model = (MyViewModel)this.DataContext; 
model.PropertyChanged += (s,e) => 
{ 
    if(e.PropertyName == "GridImgColumnVisible") 
     this.UpdateGridColumnVisibility(model.GridImgColumnVisible); 
}; 

public void UpdateGridColumnVisibility(Visibility imageVisibility) 
{ 
    var imgColumn = bookGrid.Columns.Cast<DataGridColumn>().FirstOrDefault(c => ((string)c.GetValue(Panel.NameProperty)) == "imgColumn"); 
    if(imgColumn != null) 
     imgColumn.Visibility = imageVisibility; 
} 

並添加名稱列:

<sdk:DataGridTemplateColumn x:Name="imgColumn"> 
相關問題