MVVMリストボックスDataTemplate SelectedItem

私は以下のように DataTemplate でListBoxを使用しています(簡略化されたxamlと変数名が変更されています)。


         
            
                
                    
                    
                        
                            <button Content="String1"
                                    Command="{Binding DataContext.Command1}
                                    RelativeSource={RelativeSource FindAncestor, ListBox, 1}}" />
                            <button Content="String2" 
                                    Command="{Binding DataContext.Command2}
                                    RelativeSource={RelativeSource FindAncestor, ListBox, 1}}" />
                        
                    
                
            
         
 

ボタンの1つをクリックすると、SelectedItemVar(依存関係プロパティ)が更新される必要があります。 SelectedItemVarは、それぞれのボタンのコマンドに使用されます。 SelectedItemVarは、 TextBlock または Border をクリックすると更新されますが、いずれかのボタンをクリックしても表示されません。私はこの問題に非MVVMソリューションを見つけました をクリックします。彼らがリンクで行ったように、これを解決するためにファイルビハインドにコードを追加したくありません。

XAMLで行うことができるきれいなソリューションがありますか?非MVVMソリューション以外にも、私はこの問題を抱えている人は見つけていません。私はこれがかなり一般的だと思ったでしょう。

最後に、コマンドバインドのために、この Command = "{Binding DataContext.CommandName} RelativeSource = {RelativeSource FindAncestor、ListBox、1} が見つかりました。 CommandName に直接バインドしているときにコマンドが起動していないことを確認してください。

2
ItemsSourceバインディングの前に必ずSelectedItemバインディングを配置してください。それ以外の場合、ItemsSourceのバインドが解除されると、SelectedItemはnullのセッター呼び出しを取得します。
追加された 著者 Geoff Cox,
私はバインディングがその順序で設定されていることを確認します。ポインタありがとう。
追加された 著者 StinkerPeter,

2 答え

MVVMを使用しています....非常に簡単な解決策は、両方のボタンのコマンドにSelectedItemをパラメータとして渡し、次にパラメータの値でSelectedItemを設定することです。

コード

<コード>public class YourViewmodel
{
     //Other Variables


     public YourViewModelCtor()
     {
        Command1= new RelayCommand(Command1Func);
     }

     Public SelectedVar
     {
             get {return value;}
             Set { selectedVar=value;
                       OnPropertyChanged("SelectedVar");
              }
     }

     //Other Properties


     void Command1Func(object obj)
     {
              SelectedVar= obj as ;

              //Do your thing with SelectedVar ... Do the same for Command2
     }
}

Xamlで必要な変更

<コード>
    <button Command="{Binding DataContext.Command1}" CommandParameter="{Binding}"
            Content="String1" />
    <button Command="{Binding DataContext.Command2}" CommandParameter="{Binding}"
            Content="String2" />

これにより、ボタンをクリックした現在のListBox項目feromが表示されます。

これはそれを行う必要があります...... ......

3
追加された
@StinkerPeter CommandParameterは、呼び出された関数( "obj")のパラメータにパラメータ(この場合はCurrent Row Clicked)を送り、XAMLからある値をViewModelに送信し、それに応じて処理することができます。
追加された 著者 Ankesh,
このソリューションは優れた働きをしました。私が望んでいた簡単なXAMLソリューションでした。 CommandParameter バインディングが何をしているのか教えてください。再度、感謝します!
追加された 著者 StinkerPeter,

必要なビジュアルビヘイビアを処理するにはコードが必要ですが、ビューモデルやコントロールコードビハインドに配置する必要はありません。

(SelectListBoxItemWhenClickedBehaviorのようなものと呼ばれる)ビヘイビアを記述すると、ボタンをクリックするとVisualTreeHelperを使用してビジュアルツリーのListBoxItemが検索されます。 ListBoxItem.IsSelected = trueに設定することができます。

ビヘイビアーは既知のものを1つしか持たず、ボタンがListBoxItem内にあることを知るコントロール(XAML)のビジュアルスタイルによってのみ設定されます。私はこれがM-V-VMの懸案事項の分離を維持していると思います。

あなたが行動を書くのを助ける必要があるなら、私に知らせてください。

2
追加された
私はこれを撃ち、私が助けを必要とするならば戻ってくるだろう。前に書いたことはありませんでしたが、助けを求める前に試してみませんか?再度、感謝します。
追加された 著者 StinkerPeter,
ジェフ、助けてくれてありがとう。私はあなたの解決策を試す時間がなかった。実装が簡単であることから、私は大きな答えを出しました。
追加された 著者 StinkerPeter,