2011-07-05 120 views
3

我在Silverlight應用程序,這使得大量使用棱鏡,MVVM模式和MEF的工作中結合。出於多種原因,我選擇了遵循View-first方法。司令部DataGridTemplateColumn

在其中一個視圖中有一個DataGrid,這個網格的其中一列是一個DataGridTemplateColumn,它只有一個Button。

我想同時定義命令,並在按鈕上CommandParameter。該命令應該是ViewModel的DelegateCommand。 CommandParameter應該是直接從dataGrid中出來的SelectedItems列表。

我試過幾種方法來做到這一點,但任何命令或CommandParameter爲空。

由此可見,我原來寫的代碼:

<sdk:DataGridTemplateColumn> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Width="15" Height="15" Content=">" 
        Command="{Binding UpdateSearchParametersCommand}" 
        CommandParameter="{Binding SelectedItems, ElementName=dataGrid}"> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

有人能指點我對什麼是最好的方式去了解它是什麼?

在此先感謝, 贊布羅塔。

回答

0

你們中許多人試圖幫我出這一點。謝謝你。 不幸的是,提供的答案主要與WPF有關。

下面是我解決了這個問題:

<helpers:BindingHelper.Binding> 
<helpers:BindingList> 
    <helpers:RelativeSourceBinding TargetProperty="Command" Path="DataContext.ToggleDataArchiveInheritanceCommand" RelativeMode="FindAncestor" AncestorType="ChildWindow" /> 
</helpers:BindingList> 
</helpers:BindingHelper.Binding> 

好吧,這是來自同一應用程序的另一點,但原理是一樣的。 如果在一個內部定義了一個綁定,那麼您在Silverlight中獲取通常超出範圍的其他元素(因爲它們不是DataTemplate的一部分)的唯一方法是遍歷xaml對象樹。這就是BindingHelper所做的。

張貼在這裏,我希望這些信息將被別人有用。

乾杯,

贊布羅塔

+0

Ciao Gianluca,thx發佈此...我試圖做同樣的事情,但不知道「BindingHelper」是什麼。是否有更多的代碼,或者是Silverlight中的BindingHelper? –

+0

嗨喬。你說得對,還有更多的代碼,雖然這很簡單,而且我之前在這篇文章中用文字描述過。我需要尋找我在2011年工作的源代碼,以便複製和粘貼當時創建的幫助程序類。現在歡呼。 G。 –

+0

在這裏你可以找到來源:http://snipt.org/ujph9 –

1

如果您使用ItemsSource綁定DataGrid,那麼Command和CommandParameter綁定將與當前項目關聯 - 您寫的方式。

在這種情況下,您應該使用替代來源。命令應綁定到DataContext.UpdateSearchParametersCommand和CommandParameter - DataContext.SelectedItems。

在您的情況下,無法在綁定項目中找到UpdateSearchParametersCommand和SelectedItems。

修訂

一定要設置正確的類型的祖先。我將它設置爲窗口,但也許你正在使用UserControl。

<sdk:DataGridTemplateColumn> 
<sdk:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Button Width="15" Height="15" Content=">" 
       Command="{Binding Path=DataContext.UpdateSearchParametersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
       CommandParameter="{Binding Path=DataContext.SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"> 
    </DataTemplate> 
</sdk:DataGridTemplateColumn.CellTemplate> 

+0

通過包含按鈕應該具有的xaml來改善此答案。 – AnthonyWJones

+0

@AnthonyWJones你就是。 – 26071986

+0

@ 26071986:謝謝你的回覆。但是我注意到,在你的解決方案中,你尋找一個Window類型的祖先。我可能完全錯誤,但據我所知,這在Silverlight中不受支持。這是對的嗎? –

6

您當前綁定指向DataGridRowItem.UpdateSearchParametersCommand。您需要將其更改爲指向DataGrid.DataContext.UpdateSearchParametersCommand

<sdk:DataGrid x:Name=dataGrid> 
    <sdk:DataGridTemplateColumn> 
     <sdk:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Button Width="15" Height="15" Content=">" 
         Command="{Binding DataContext.UpdateSearchParametersCommand, ElementName=dataGrid}" 
         CommandParameter="{Binding SelectedItems, ElementName=dataGrid}"> 
      </DataTemplate> 
     </sdk:DataGridTemplateColumn.CellTemplate> 
    </sdk:DataGridTemplateColumn> 
</sdk:DataGrid> 
1

在Silverlight 5,你可以做到這一點

<Button Command="{Binding Path=DataContext.PreviewPublishCommand, RelativeSource={RelativeSource AncestorType=controls:ChildWindow}}" Content="Publish" /> 

只要調整AncestorType是無論你的頂級元素(用戶控件,ChildWindow等)。