Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据绑定到ViewModel包装器并将其作为参数传递给RelayCommand?_C#_Wpf_Xaml_Mvvm_Data Binding - Fatal编程技术网

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

C# 如何将数据绑定到ViewModel包装器并将其作为参数传递给RelayCommand?,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我一直在网上搜索,但找不到我需要的答案 我有一个列表,用户可以在其中选择一些项目。在我的ViewModel中,它如下所示: public ObservableCollection<RentalItemVM> ChosenRentalItems { get { return chosenRentalItems; } set { chosenRentalItems = value; RaiseProperty

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

我有一个列表,用户可以在其中选择一些项目。在我的ViewModel中,它如下所示:

public ObservableCollection<RentalItemVM> ChosenRentalItems {
        get { return chosenRentalItems; }
        set {
            chosenRentalItems = value;
            RaisePropertyChanged("ChosenRentalItems");
        }
    }
public RelayCommand<ObservableCollection<RentalItemVM>> FinishCommand { get; set; }
private void Finish(ObservableCollection<RentalItemVM> chosenItems) {
        ...
    }
public observeCollection ChosenRentalItems{
获取{return chosenRentalItems;}
设置{
chosenRentalItems=值;
RaisePropertyChanged(“ChosenRentalItems”);
}
}
当用户完成选择后,他按下按钮保存他的收藏。如果我像这样设置我的RelayCommand,它可以正常工作:

public ObservableCollection<RentalItemVM> ChosenRentalItems {
        get { return chosenRentalItems; }
        set {
            chosenRentalItems = value;
            RaisePropertyChanged("ChosenRentalItems");
        }
    }
public RelayCommand<ObservableCollection<RentalItemVM>> FinishCommand { get; set; }
private void Finish(ObservableCollection<RentalItemVM> chosenItems) {
        ...
    }
public RelayCommand FinishCommand{get;set;}
专用空隙饰面(可观察到的收集选择项){
...
}
现在我还需要获取UserId,所以经过一些研究,我发现我不能向RelayCommand传递多个参数,所以我需要一个包装器。我制作了一个新的ViewModel:

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

    ObservableCollection<RentalItemVM> ChosenItems { get; set; }
}
公共类OrderVM{
public int UserId{get;set;}
ObservableCollection ChosenItems{get;set;}
}
并将RelayCommand更改为:

public RelayCommand<OrderVM> FinishCommand { get; set; }
private void Finish(OrderVM order) {
        ...
    }
public RelayCommand FinishCommand{get;set;}
私有无效完成(OrderVM订单){
...
}
我将XAML用户控件更改为:

<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,因此可能需要先实例化它


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

如果命令
FinishCommand
与DataConext位于同一视图模型中,您也可以绑定
UserId

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

并从实现该命令的ViewModel实例中获取用户ID

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

重新思考这个问题后,我也在考虑这个问题。但是真的没有办法绑定OrderVM吗?您可以尝试使用
ValueConverter
,但我认为您会遇到同样的问题。