2017-08-02 14 views
0

私はListBoxコントロールで状況があります。アイテムテンプレートの中にボタンがあります。ボタンをクリックすると、ボタンが入っているアイテムに変更するには、ListBoxのアイテムを選択したいと思っています。アイテムテンプレート内の他の場所をクリックして選択したアイテムを変更できますが、選択しても機能しませんボタン。コメント欄の最後の文を明確にするために、ボタンではないアイテムテンプレートをクリックすると、SelectedItemが期待どおりに変更されます。アイテムテンプレート内のボタンをクリックすると、SelectedItemは変更されません。ListBox内のボタンItemTemplateはアイテムを選択していません

詳細情報:私はMVVMを使用しており、ボタンはビューモデル内のコマンドにアタッチされています。どのような解決策でも、これを継続して動作させる必要があります。

ListBoxはItemSourceにリンクされており、ListBoxのSelectedItemはビューモデルのプロパティにバインドされています。

これを行う方法が設定されていれば、私は今までそれを見つけることができませんでした。

私はC#とVisual Studio 2010

感謝を使用しています。

+1

XAMLとCSのビットは本当に参考になります。 * "ボタンを選択しても機能しない" * - どのように機能しないのですか? – Sinatr

答えて

1

ToggleButtonを使用してIsCheckedListBoxItemIsSelectedのプロパティにバインドすることができれば、それは問題ありません。
ボタンがMouseDownイベントを処理しているため、ListBoxItemが選択されていないため、ListBoxItemがクリックを認識しないためです。あなたのボタンでClickのイベントハンドラを作成し、e.Handled = false;に設定します。

+0

申し訳ありませんが、わかりません。あなたはこれら2つのことを両方とも必要と言いますか? – TheFaithfulLearner

+0

@TheFaithfulLearner心配することはありません、私が意味していたことは_あなたができれば、それはあなたが 'Button'を使う必要がないということです。これは、いったん完了したらボタンを「クリックしない」ようにする必要があることを意味します。しかし、どちらも必要ではありません。 Clickイベントハンドラを追加して、 'e.handled = false;'を設定してみてください – XAMlMAX

+0

@ TheFaithfulLearnerそしてもう1つ。イベントハンドラを配置するときは、XAMLの中にコマンドビディングの前にあるようにして、コマンドの前に実行されるようにしてください。 – XAMlMAX

1

コードの一部が参考になりましたが、ここでMVVMパターンを使用してボタンをクリックしてListBoxItemを選択する方法のダミーの例があります。

public class MyViewModel : BaseViewModel // implements INotifyPropertyChanged 
{ 
    private ICommand _myCommand; 

    public ICommand MyCommand { get {return _myCommand;} private set { _myCommand = value; OnPropertyChanged(); }} 

    private ObservableCollection<int> _myObjects; 

    public ObservableCollection<int> MyObjects { get {return _myObjects;} private set {_myObjects = value; OnPropertyChanged();}} 

    private int _mySelectedObject; 

    public int MySelectedObject { get {return _mySelectedObject;} set {_mySelectedObject = value; OnPropertyChanged(); }} 

    public MyViewModel 
    { 
     MyCommand = new RelayCommand(SetSelectedObject); // the source code for RelayCommand may be found online. 
    } 

    private void SetSelectedObject(object obj) 
    { 
     int myInt = (int)obj; 

     MySelectedObject = myInt; 
    } 
} 

XAMLの一部は、簡単にするために消去されています。このスニペットをコピー/ペーストしてコードに適用しないでください。

<UserControl x:Name="root" DataContext="{Binding MyViewModel, Source={StaticResource Locator.MyViewModel}}"> 
    <ListBox ItemsSource="{Binding MyObjects}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding }"/> 
        <Button Command="{Binding MyCommand, ElementName=root}" CommandParameter="{Binding }"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</UserControl> 

このコードはテストしていません。だから、いくつかの間違いがあるかもしれません。これらを指摘することをためらわずに、コードを更新します。

EDIT:ここでは、(Telerikから変更)私のRelayCommand実装のソースコードです:

public class RelayCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    private Action<object> _methodToExecute; 
    private Func<object, bool> _canExecuteEvaluator; 

    public RelayCommand(Action<object> methodToExecute, Func<object, bool> canExecuteEvaluator) 
    { 
     _methodToExecute = methodToExecute; 
     _canExecuteEvaluator = canExecuteEvaluator; 
    } 

    public RelayCommand(Action<object> methodToExecute) 
     : this(methodToExecute, null) 
    { 
    } 

    public bool CanExecute(object parameter) 
    { 
     if (_canExecuteEvaluator == null) 
     { 
      return true; 
     } 
     else 
     { 
      bool result = _canExecuteEvaluator.Invoke(parameter); 
      return result; 
     } 
    } 

    public void Execute(object parameter) 
    { 
     _umethodToExecute.Invoke(parameter); 
    } 
} 
+0

こんにちは。情報のおかげで。私はこれを実践し始めましたが、MyCommandを初期設定して、パラメータ 'SetSelectedObject'を持つ新しいRelayCommandにしようとしました。その方法も存在し、あなたがそれを書いた通りです。指定されたエラーは '引数1:'メソッドグループ 'から' System.Action 'に変換できません。私はMVVM Lightを使っています...多分それは物事に影響を与えます。 – TheFaithfulLearner

+0

私のソリューションを使用する場合は、別のRelayCommand実装を使用する必要があります。私の記事を参照してください、私はそれを編集しました。 – Atlasmaybe

関連する問題