2011-09-28 61 views
13

ViewModelにView(XAMLが付属)をコマンドで添付しています。私は、DataGridの行のボタンがクリックされたときにcommandを呼び出す必要があります。私はこれのために行動を使用しています(通常の指揮は同じ問題があります)。 DataGridのボタンをクリックすると、私のコマンドは起動しません。DataGridTemplateColumn内でコマンドをバインドする

問題を説明するために、私はリストボックスをEXACTの同じバインディング用のものに置きました。そう、コマンドは機能します。 。名前は=「コントロール」:だから、それは私が、問題は、このラインはあなたのXAMLでの原因は何の要素が(別名X名のコントロールで定義されていない

<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 

だと思うのDataGrid/DataGridTemplateColumn

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding}"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="30" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <Button Content="Cancel" > 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <ei:CallMethodAction MethodName="Cancel" TargetObject="{Binding}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Button> 
      </StackPanel> 
      <sdk:DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Data}" Grid.Row="1"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto"> 
         <sdk:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Button Content="Select"> 
            <i:Interaction.Triggers> 
             <i:EventTrigger EventName="Click"> 
              <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
             </i:EventTrigger> 
            </i:Interaction.Triggers> 
           </Button> 
          </DataTemplate> 
         </sdk:DataGridTemplateColumn.CellTemplate> 
        </sdk:DataGridTemplateColumn> 
        <sdk:DataGridTextColumn Binding="{Binding DeviceId}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Device" Width="Auto" FontWeight="Bold" /> 
        <sdk:DataGridTextColumn Binding="{Binding SerialNumber}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Serial Number" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding LastActivityOn}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Last Activity" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding ClientVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Client Version" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding OSVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="OS Version" Width="Auto" /> 
       </sdk:DataGrid.Columns> 

      </sdk:DataGrid> 
      <ListBox Grid.Row="2" ItemsSource="{Binding Data}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding DeviceId}"></TextBlock> 
          <Button Content="Select"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Click"> 
             <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </Button> 
         </StackPanel>       
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 
+0

誰も知らない..? – katit

+0

なぜボタンのCommandプロパティを使用するのではなく、EventTriggerを使用していますか? – Jehof

+0

@Jehofコマンドを使用すると同じ問題が発生します。私はアプリケーション全体で一貫性のためのイベントトリガを使用しています – katit

答えて

18

私はかなりDataGridの中にいると確信していますが、依然としてバインディングを動作させるためにDataContextProxyが必要です。 (DataGridTemplateColumnがビジュアルツリーにないためListBoxテンプレートのために、はい、それが働いているのではなくDataGrid、これはある)でもUPDATE

のSilverlight 4で、バインディングのElementNameは動作しません

でSilverlight 5のDataContextProxyは、AncestorバインディングのサポートのおかげでDataGridには必要ありません。

<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType=sdk:DataGrid}}" /> 
+0

デフォルトのRelativeSourceMode値はプラットフォーム固有ですので、

2

と何か)。

コマンドがLayoutRootにバインドされているDataContextの上で定義されている場合は、のElementName = LayoutRootのElementName =コントロールを変更する必要があります。

ListBoxでこれがなぜ機能するのかわかりません。

+0

私はユーザーコントロールのx:Name = Controlを持っています。また、ListBoxのために動作します – katit

関連する問題