C# WPF与ItemsSource的数据绑定交互

C# WPF与ItemsSource的数据绑定交互,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,在我的列表框中,有一些控件需要绑定到ItemsSource和Viewmodel中的属性。如您所见,按钮需要同时执行这两项操作。我似乎能够做到这一点的唯一方法是非常丑陋的(请参阅绑定到视图视图模型的IsEnabled属性)。我想知道最好的方法是什么 编辑:为了澄清,我想将IsEnabled属性绑定到CanRemove <Button IsEnabled="{Binding CanRemove}"></Button> 据我所知,在您的MVVM中有一个bool“CanRemo

在我的列表框中,有一些控件需要绑定到ItemsSource和Viewmodel中的属性。如您所见,按钮需要同时执行这两项操作。我似乎能够做到这一点的唯一方法是非常丑陋的(请参阅绑定到视图视图模型的IsEnabled属性)。我想知道最好的方法是什么

编辑:为了澄清,我想将IsEnabled属性绑定到CanRemove

<Button IsEnabled="{Binding CanRemove}"></Button>

据我所知,在您的MVVM中有一个bool“CanRemove”。您可以使用.NET提供的可见性将其绑定到按钮可见性,当您执行mvvm并想要使用按钮时,您应该使用DelegateCommand或RelayCommand。如果您使用这个,那么您只需要正确地实现ICommand(CanExecute!),绑定到按钮的命令将为您处理IsEnabled

  <Button Command="{Binding MyRemoveCommand}"></Button>

当您可以使用标记扩展直接访问ViewModel时,您根本不需要转换器。这应该起作用:

<Button IsEnabled="{Binding DataContext.CanRemove,
              RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>


因为ListBox的DataContext指向viewModel实例,所以上面发布的代码可以使用。

谢谢,这就是我要找的。这很有意义,也很有效。但是当你使用MVVM时,这不是你应该采用的方式。按钮应具有命令绑定
public class ItemButtonConverter : IValueConverter
{
    public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
    {
        AlbumTrackAssociationViewModel vm = (AlbumTrackAssociationViewModel)value;
        return vm.CanRemove;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  <Button Command="{Binding MyRemoveCommand}"></Button>
  public ICommand MyRemoveCommand {get;set;}

  this.MyRemoveCommand = new DelegateCommand(this.RemoveCommandExecute, this.CanRemoveCommandExecute);

  private bool CanRemoveCommandExecute()
  {
      return this.CanRemove;
  }

  private bool RemoveCommandExecute()
  {
      if(!this.CanRemoveCommandExecute)
        return;

     //execution logic here
  }
<Button IsEnabled="{Binding DataContext.CanRemove,
              RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>