2010-03-24 38 views
0

我正在使用MVVM模式。我已經綁定了我的項目,並且只想在數據網格中選擇一行時顯示編輯按鈕。 WPF中的觸發器似乎是可能的,但我們在Silverlight中沒有觸發器。我嘗試了一個TemplatedParent綁定,但我不確定在這種情況下TemplatedParent是什麼。我們在Silverlight中也沒有RelativeSource祖先。在這一點上,我要看看使用後面的代碼的解決方案...如何在Silverlight數據網格中選擇一行時更改DataTemplate中元素的可見性?

<data:DataGrid.Columns> 
    <data:DataGridTemplateColumn IsReadOnly="True" Header="Name" Width="300"> 
     <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock x:Name="textBlock" Text="{Binding Name, Mode=OneWay}" VerticalAlignment="Center" Margin="4,4,0,4"/> 
       <Button Margin="1,1,4,1" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="7,4" Content="Edit" /> 
      </Grid> 
     </DataTemplate> 
     </data:DataGridTemplateColumn.CellTemplate> 
    </data:DataGridTemplateColumn> 
</data:DataGrid.Columns> 

回答

1

有幾個方法,你可以在Silverlight做到這一點,但我不認爲任何人可以是純XAML解決方案。使用MVVM,您可以在視圖模型中創建屬性,並將其綁定到DataGrid的SelectedItem屬性。從那裏,有兩個不同的充選項:

  1. 如果DataGird個別項目本身其他視圖模型,那麼你可以讓他們像「IsEditable」的屬性,並將其綁定到按鈕的可見性。當父視圖模型的SelectedItem發生更改時,請轉到並更新所有子視圖模型的IsEditable屬性
  2. 如果您沒有子視圖模型,則可以處理編輯按鈕的加載事件。在後面的代碼中,將按鈕的可見性綁定到視圖模型中的selecteditem屬性,還設置綁定轉換器,將原始綁定項作爲轉換器參數。在轉換器,您可以檢查是否選擇的項目是等於最初結合的項目
+0

我走了類似於選項1的東西。我添加了一個IsSelected屬性到我的項目viewmodel(我有一個項目PagedCollectionView)。我使用SelectionChanged事件遍歷e.RemovedItems並清除選定的標誌。 e.AddedItems也一樣。我可能會考慮將SelectedItem添加到我的主視圖模型中。如果有人走這條路線,我認爲最簡單的方法是清除舊項目上SelectedItem的setter標誌並在新的SelectedItem上設置標誌。 – miketrash 2010-03-24 22:11:23

0

如果只有Silverlight中有一個的RelativeSource FindAncestor結合...

一個哈克的想法我可以建議將是一種-的將編輯控件放入DataGrid本身的RowDetailsTemplate中,然後將RowDetailsVisibilityMode設置爲VisibleWhenSelected。

它可能不是你看起來後的樣子,但它可能「解決」你的特定用例。

如果沒有,那麼我可能會在這裏(非常小心)違反MVVM。通常DataGrids是混合子邊緣案例;他們幾乎都需要一些各種代碼隱藏。

+0

我認爲使用RowDetails,但你是對的..外觀不是我要去的。不錯的建議。 – miketrash 2010-03-24 22:05:31

相關問題