C# WPF与ItemsSource的数据绑定交互
在我的列表框中,有一些控件需要绑定到ItemsSource和Viewmodel中的属性。如您所见,按钮需要同时执行这两项操作。我似乎能够做到这一点的唯一方法是非常丑陋的(请参阅绑定到视图视图模型的IsEnabled属性)。我想知道最好的方法是什么 编辑:为了澄清,我想将IsEnabled属性绑定到CanRemoveC# 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
<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}}"/>