【问题标题】:Multibinding Command Parameters多绑定命令参数
【发布时间】:2014-07-22 23:15:32
【问题描述】:

所以我为每个单独的列表视图项目提供了一个上下文菜单,并且列表视图绑定到一个用户列表。上下文菜单有一个绑定到用户状态的可观察集合的子菜单。我希望能够将列表视图中的用户 ID 和上下文菜单中的新状态 ID 传递给我的更新命令参数。我刚刚研究了 MultiBindings,并相信这可能是一个很好的长期解决方案,我可以在其他地方使用。这是一些代码:

用户视图中的列表视图:

<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; }

}

我很确定我现在 100% 迷路了。

【问题讨论】:

    标签: wpf data-binding mvvm-light multibinding relaycommand


    【解决方案1】:
    1. 这不是必需的,因为我在您的其他问题中已经提到过,因为您的对象模型中有除了新状态之外的所有信息

      将命令和UpdateStatus 方法移到UserPanelItem 的类中,该类也应该保存您的ID,然后您只需将命令更改为:

      new RelayCommand(param => UpdateStatus(ID, (UserStatusList)param))
      
    2. 如果你真的想这样做:你再次设置父MenuItemCommandParameter,其命令将永远不会被使用,将其移动到CommandParameter-SetterValue在容器样式中,即

      <Setter Property="CommandParameter">
          <Setter.Value>
              <MultiBinding ...>
                  ....
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2019-12-25
      • 2015-05-08
      • 2015-07-29
      相关资源
      最近更新 更多