私の問題は、この質問で説明されている問題と似ています:
WPF MVVM Button Control Binding in DataTemplate
ここに私のXAMLがあります:
<Window x:Class="MissileSharp.Launcher.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MissileSharp Launcher" Height="350" Width="525">
<Grid>
<!-- when I put the button here (outside the list), the binding works -->
<!--<Button Content="test" Command="{Binding Path=FireCommand}" />-->
<ListBox ItemsSource="{Binding CommandSets}">
<ListBox.ItemTemplate>
<DataTemplate>
<!-- I need the button here (inside the list), and here the binding does NOT work -->
<Button Content="{Binding}" Command="{Binding Path=FireCommand}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
これは、名前付き(ViewModel 内にある) にListBox
バインドされた単なるです。
このバインドは機能します (コレクション内の各アイテムのボタンが表示されます)。ObservableCollection<string>
CommandSets
FireCommand
次に、ViewModel にもあるコマンド ( ) にボタンをバインドします。
ViewModel の関連部分は次のとおりです。
public class MainWindowViewModel : INotifyPropertyChanged
{
public ICommand FireCommand { get; set; }
public ObservableCollection<string> CommandSets { get; set; }
public MainWindowViewModel()
{
this.FireCommand = new RelayCommand(new Action<object>(this.FireMissile));
}
private void FireMissile(Object obj)
{
System.Windows.MessageBox.Show("fire");
}
}
このボタンのバインドは機能しません。上記でリンクした質問
から私が理解したことから、バインディングが機能しない理由は次のとおりです。(間違っている場合は修正してください)
- ボタンは の内部にあるため、 (この場合は )
ListBox
のバインディングのみを「認識」し、メイン ウィンドウのバインディングは認識しません。ListBox
ObservableCollection
- メイン ウィンドウのメイン ViewModel のコマンドにバインドしようとしています (ボタンは「認識」していません)。
コマンド自体は間違いなく正しいです。ボタンを外部に配置するとListBox
(例については上記の XAML を参照)、バインディングが機能し、コマンドが実行されるからです。
どうやら、フォームのメイン ViewModel にバインドするようにボタンに指示する必要があるだけです。
しかし、正しい XAML 構文を理解できません。
グーグルで見つけたいくつかのアプローチを試しましたが、どれもうまくいきませんでした:
<Button Content="{Binding}" Command="{Binding RelativeSource={RelativeSource Window}, Path=DataContext.FireCommand}" />
<Button Content="{Binding}" Command="{Binding Path=FireCommand, Source={StaticResource MainWindow}}" />
<Button Content="{Binding}" Command="{Binding Path=FireCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
誰かお願いします:
ListBox
内のボタンをフォームのコマンドにバインドする適切な XAML を教えてくださいMainViewModel
。- WPF/MVVM の初心者が理解できる方法でこの高度なバインディングが説明されているリンクを教えてください。
私は難解な XAML の呪文をコピーして貼り付けているだけのように感じています。これまでのところ、どのような場合に必要になるかを自分でどのように理解するかについての手がかりがありません (そして適切なドキュメントが見つかりません)。RelativeSource
またはStaticResource
、「通常の」バインディングの代わりに何でも。