Wpf 多绑定命令参数
因此,我为每个单独的listview项都有一个上下文菜单,listview绑定到一个用户列表。上下文菜单有一个子菜单,该子菜单绑定到可观察的用户状态集合。我希望能够将列表视图中的用户id和上下文菜单中的新状态id传递给我的更新命令参数。我只是研究了多重绑定,并相信这可能是一个很好的长期解决方案,我可以在其他地方使用。下面是一些代码: 用户视图中的列表视图:Wpf 多绑定命令参数,wpf,data-binding,mvvm-light,multibinding,relaycommand,Wpf,Data Binding,Mvvm Light,Multibinding,Relaycommand,因此,我为每个单独的listview项都有一个上下文菜单,listview绑定到一个用户列表。上下文菜单有一个子菜单,该子菜单绑定到可观察的用户状态集合。我希望能够将列表视图中的用户id和上下文菜单中的新状态id传递给我的更新命令参数。我只是研究了多重绑定,并相信这可能是一个很好的长期解决方案,我可以在其他地方使用。下面是一些代码: 用户视图中的列表视图: <ListView Background="Transparent" ItemsSource="{Binding UserList}"
<ListView Background="Transparent" ItemsSource="{Binding UserList}" SelectionMode="Single">
<ListView.Resources>
<ContextMenu x:Key="Menu" DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Name="UserID" Header="{Binding UserID}"/>
<Separator></Separator>
<MenuItem Header="Status" ItemsSource="{Binding DataContext.UserStatus, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
DisplayMemberPath="Name" Name="StatusID">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.UpdateDriverStatus, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" />
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
<MenuItem.CommandParameter>
<MultiBinding Converter="{StaticResource MultiBindConverter}">
<Binding ElementName="DriverID"></Binding>
<Binding ElementName="StatusID"></Binding>
</MultiBinding>
</MenuItem.CommandParameter> </MenuItem>
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource Menu}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding UserName}" >
</TextBlock>
</ItemContainerTemplate>
</ListView.ItemTemplate>
</ListView>
public class UsersPanelVM : ViewModelBase, INotifyPropertyChanged
{
public ObservableCollection<UserPanelItem> UserList { get; set; }
public ObservableCollection<UserStatusList> UserStatus { get; set; }
private readonly IUserService _userService;
public IUserService UserService { get { return this._userService; } }
public UsersPanelVM(IUserService userService)
{
this._userService = userService;
var model = this.UserService.GetUsers();
this.UserList = model.Users;
var statusmodel = this.UserService.GetUserStatus();
this.UserStatus = statusmodel.UserStatus;
this.UpdateUserStatus = new RelayCommand<UserStatusList>((s) => UpdateStatus(1,s));
}
//The 1, above, is hard coded to test the method call, but ideally that should be the selected UserID
private void UpdateStatus(int ID, UserStatusList s)
{
}
public RelayCommand<UserStatusList> UpdateUserStatus { get; private set; }
}
用户虚拟机:
<ListView Background="Transparent" ItemsSource="{Binding UserList}" SelectionMode="Single">
<ListView.Resources>
<ContextMenu x:Key="Menu" DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Name="UserID" Header="{Binding UserID}"/>
<Separator></Separator>
<MenuItem Header="Status" ItemsSource="{Binding DataContext.UserStatus, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
DisplayMemberPath="Name" Name="StatusID">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.UpdateDriverStatus, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" />
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
<MenuItem.CommandParameter>
<MultiBinding Converter="{StaticResource MultiBindConverter}">
<Binding ElementName="DriverID"></Binding>
<Binding ElementName="StatusID"></Binding>
</MultiBinding>
</MenuItem.CommandParameter> </MenuItem>
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource Menu}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding UserName}" >
</TextBlock>
</ItemContainerTemplate>
</ListView.ItemTemplate>
</ListView>
public class UsersPanelVM : ViewModelBase, INotifyPropertyChanged
{
public ObservableCollection<UserPanelItem> UserList { get; set; }
public ObservableCollection<UserStatusList> UserStatus { get; set; }
private readonly IUserService _userService;
public IUserService UserService { get { return this._userService; } }
public UsersPanelVM(IUserService userService)
{
this._userService = userService;
var model = this.UserService.GetUsers();
this.UserList = model.Users;
var statusmodel = this.UserService.GetUserStatus();
this.UserStatus = statusmodel.UserStatus;
this.UpdateUserStatus = new RelayCommand<UserStatusList>((s) => UpdateStatus(1,s));
}
//The 1, above, is hard coded to test the method call, but ideally that should be the selected UserID
private void UpdateStatus(int ID, UserStatusList s)
{
}
public RelayCommand<UserStatusList> UpdateUserStatus { get; private set; }
}
public类UsersPanelVM:ViewModelBase,INotifyPropertyChanged
{
公共ObservableCollection用户列表{get;set;}
公共ObservableCollection用户状态{get;set;}
专用只读IUserService\u userService;
公共IUserService UserService{get{返回此。\u UserService;}}
公共用户spanELVM(IUserService用户服务)
{
这是。_userService=userService;
var model=this.UserService.GetUsers();
this.UserList=model.Users;
var statusmodel=this.UserService.GetUserStatus();
this.UserStatus=statusmodel.UserStatus;
this.UpdateUserStatus=新的RelayCommand((s)=>UpdateStatus(1,s));
}
//上面的1是硬编码的,用于测试方法调用,但理想情况下应该是所选的UserID
私有void UpdateStatus(int-ID,UserStatusList)
{
}
public RelayCommand UpdateUserStatus{get;private set;}
}
我很确定我在这一点上100%迷失了方向
UpdateStatus
方法移动到UserPanelItem
的类中,该类也应保存您的ID,然后您只需将命令更改为:
new RelayCommand(param => UpdateStatus(ID, (UserStatusList)param))
CommandParameter
,将其移动到容器样式中的CommandParameter
-Setter
的值,即
<Setter Property="CommandParameter">
<Setter.Value>
<MultiBinding ...>
....
....