2016-06-01 6 views
0

グリッドを持つUserControlBaseがあります。グリッドにはアクションを含む列が含まれています。ICommandがSilverlightユーザーコントロールで動作しません

<sdk:DataGridTemplateColumn Header="Action"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button Style="{StaticResource DataGridButton}" Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" Content="Modify" /> 
      </StackPanel> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

私の問題は私のCommandです。それは私の最初の問題である私に技術的なエラーを投げている、私はこのアプリケーションが本当のエラーメッセージをスローする方法を知らない。

protected void RegisterMessages() 
{ 
    Messenger.Default.Register<string>(this, "NewNewsBtn_Click", NewNewsBtn_Click); 
    Messenger.Default.Register<string>(this, "ModifyNewsBtn_Click", ModifyNewsBtn_Click); 
} 

そして、私のコンストラクタで:

public NewsWindow(int underlyingId) 
{ 
    InitializeComponent(); 
    this.RegisterMessages(); 
    viewModel = new NewsViewModel(underlyingId); 
    ucNewsPanel.DataContext = viewModel; 
} 

マイビューモデル(NewsViewModel)

public ICommand ModifyNewsCommand 
{ 
    get 
    { 
     return new RelayCommand<string>(e => 
     { 
      Messenger.Default.Send(string.Empty, "ModifyNewsBtn_Click"); 
     }); 
    } 
} 

は何私のユーザーコントロールの背後にあるコードで

は、私がイベントを登録しました私の ModifyNewsBtnの間に私の NewNewsBtnが働いていて、ここで変ですそうではありません。

このボタンはグリッドの外側にあるため、動作している理由が異なる場合があります。

<Button x:Name="NewNewsBtn" MaxHeight="50" MaxWidth="100" Command="{Binding Path=NewNewsCommand}" Content="Add New" /> 
+0

は、なぜあなたはあなたのバインディングの代わりに、ただのDataContextにアクセスするにはStaticResourceを使用します:あなたはsilverlight5を使用している場合は、AncestorBindingを使用することができますか?これがあなたのボタンが動作しない原因のように私に見えます。 – Martin

+0

私は – ViVi

+0

@Martin **「{パス= ModifyNewsCommand、バインディングソース= {StaticResource NewsViewModel}}」=コマンド**この部分は間違っていると思います - StaticResourceを削除し、ちょうどパスを残す場合は、それが機能していません。それは私にエラーを投げているわけではありませんが、方法に入っていません。 –

答えて

1

DataGridはいくつかのコレクションにバインドされ、各アイテムごとに行があります。アイテムは、行のDataContextです。あなたがしなければならないのは、 "Modify"ボタンを親のDataContextにバインドすることです。

<Button 
    Content="Modify" 
    Command="{Binding 
     Path=DataContext.ModifyNewsCommand, 
     RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
+0

それは働いた!どうもありがとうございました! –

0

あなたの構文は大丈夫になります

<Button Style="{StaticResource DataGridButton}" Content="Modify" 
    Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"/> 

しかし、あなたは、コード内であなたのViewModelを設定します。 XAMLでStaticResourceを作成するのは正しいですか?そうであれば、コードの後ろにあるDataContextの設定を削除するだけで、次の行が表示されます。Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"は、あなたのviewModelの別のインスタンスに表示されます。私は私のビューモデルにパラメータを渡していますように私は背後にあるコードでのDataContextを必要

アップデートを(原因あなたはStaticResourceとコードビハインドのようにNewsViewModelの2つのインスタンスを作成しました)。どのように私はそれを後ろからコードを削除することができますか?
次に、あなたはCommandの結合からStaticResourceを削除する必要があります。

<Button Style="{StaticResource DataGridButton}" Command="{Binding ModifyNewsCommand}" 
                    Content="Modify"/> 

あなたがNewsViewModelの別のインスタンスに参照されている原因。

+0

私はビューモデルにパラメータを渡しているので、コードの中に 'DataContext'が必要でした。どのように私はそれを後ろからコードを削除することができますか? –

+0

@GeraldGonzalesしてください、私の更新された答えを参照してください – StepUp

+0

更新された答えは動作しません。ビューモデルが見つかりません。 –

関連する問題