如何将数据绑定到ViewModel包装器并将其作为参数传递给RelayCommand?

时间:2017-06-03 12:16:20

标签: c# wpf xaml mvvm data-binding

我一直在网上搜索,但找不到我需要的答案。

我有一个列表,用户可以在其中选择一些项目。在我的ViewModel中,它看起来像这样:

public ObservableCollection<RentalItemVM> ChosenRentalItems {
        get { return chosenRentalItems; }
        set {
            chosenRentalItems = value;
            RaisePropertyChanged("ChosenRentalItems");
        }
    }

当用户完成选择时,他按下按钮以保存他的收藏。如果我像这样设置我的RelayCommand,它工作正常:

public RelayCommand<ObservableCollection<RentalItemVM>> FinishCommand { get; set; }
private void Finish(ObservableCollection<RentalItemVM> chosenItems) {
        ...
    }

现在我需要获得UserId,所以经过一些研究后我发现我不能将多个参数传递给RelayCommand所以我需要一个包装器。我创建了一个新的ViewModel:

public class OrderVM {
    public int UserId { get; set; }

    ObservableCollection<RentalItemVM> ChosenItems { get; set; }
}

并将RelayCommand更改为:

public RelayCommand<OrderVM> FinishCommand { get; set; }
private void Finish(OrderVM order) {
        ...
    }

我改变了XAML UserControl:

<StackPanel Orientation="Horizontal"
            Grid.Row="3"
            Grid.ColumnSpan="2"
            VerticalAlignment="Center"
            HorizontalAlignment="Center">
        <TextBox Text="UserId" />
        <Button Content="Finish"
                Command="{Binding FinishCommand}"
                CommandParameter="{Binding ChosenRentalItems}"
                UseLayoutRounding="False"
                FontSize="24" />
    </StackPanel>

到此:

<StackPanel Orientation="Horizontal"
            Grid.Row="3"
            Grid.ColumnSpan="2"
            VerticalAlignment="Center"
            HorizontalAlignment="Center">
        <TextBox Text="UserId"
                 x:Name="UserId" />
        <Button Content="Finish"
                Command="{Binding FinishCommand}"
                CommandParameter="{Binding OrderVM}" 
                UseLayoutRounding="False"
                FontSize="24" />
    </StackPanel>

现在这是我感到困惑的地方。我不知道如何绑定UserId和ChosenItems。 RelayCommand中的OrderVM参数为null,所以我可能需要先实例化它吗?

我在网上找到的大多数答案都是关于在View中显示来自ViewModel的数据,但几乎没有关于如何发布数据的答案(或者我搜索了错误的东西?)

1 个答案:

答案 0 :(得分:1)

如果命令FinishCommand与DataConext的视图模型相同,则也可以绑定UserId

<TextBox Text="{Binding UserId} "  x:Name="UserId"></TextBox>

并从实现命令的ViewModel实例中获取UserId。

private void Finish(ObservableCollection<RentalItemVM> chosenItems) {
    var userid = this.UserId;
    foo(userid);
}