C# 在视图模型之间传递属性

C# 在视图模型之间传递属性,c#,wpf,C#,Wpf,我也问过类似的问题,但我没有找到一个适合我的代码的答案。我试图用WPF将数据(客户机类型Id)从名为client的视图模型传递到名为Line的视图模型(每个客户机都有多行,因此我输入的行应该知道哪个客户机是所有者) 更新:add命令 这是客户端代码: public class CRMClientViewModel : BaseViewModel { static string currentClient; public Command AddLineCommand { ge

我也问过类似的问题,但我没有找到一个适合我的代码的答案。我试图用WPF将数据(客户机类型Id)从名为client的视图模型传递到名为Line的视图模型(每个客户机都有多行,因此我输入的行应该知道哪个客户机是所有者)

更新:add命令

这是客户端代码:

public class CRMClientViewModel : BaseViewModel
{

    static string currentClient;


    public Command AddLineCommand { get; set; }

    public CRMClientViewModel(object obj)
    {

        AddLineCommand = new Command(OnAddLineCommand);
    }
    void OnAddLineCommand(object obj)
    {
        MainWindowViewModel.Instance.ShowCRMClient = false;
        MainWindowViewModel.Instance.ShowCRMLine = true;

    }

    private string _clientId;

    public string ClientId
    {
        get { return _clientId; }
        set
        {
            _clientId = value;
            RaisePropertyChanged();
            currentClient = value;
        }
    }






}
}
基本视图模型包含:

public class BaseViewModel : INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

}
这是客户端视图的xaml:

  <UserControl x:Class="DiamondCellular.View.CRMClientView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ViewModel="clr-namespace:DiamondCellular.View.ViewModels"
        xmlns:local="clr-namespace:DiamondCellular.View"
        mc:Ignorable="d"
        Height="350" Width="525" FontSize="18" Background="White">

    <UserControl.DataContext>
        <ViewModel:CRMClientViewModel/>
    </UserControl.DataContext>




        <Button x:Name ="Add" Content="AddLine" Command ="{Binding AddLineCommand}" Grid.Column="4" Grid.Row="6" Foreground="#FFFF0012" Margin="0,10.4,17.8,9.8" VerticalAlignment="Center" HorizontalAlignment="Right" FontSize="12" Width="71"/>



</UserControl>


我正在尝试将从客户机视图获得的客户机Id传递到线视图模型

如果我理解正确,您希望有一个经典的主-详细视图,即父子视图

您可以在构造函数中将“父”传递给“子”

void OnAddLineCommand(object obj)
{
//...
var lineVM = new LineViewModel(this);
this.Lines.Add(lineVM);
//...
} 
我假设您希望使用客户机的线路(不管是什么)。您需要一个包含
行的属性

public ObservableCollection<LineViewModel>{get;}
publicobservableCollection{get;}

在保存父对象时(在您的案例中是
客户机
),您还保存了所有子对象。

如果我理解正确,您希望有一个经典的主-详细视图,即父-子视图

您可以在构造函数中将“父”传递给“子”

void OnAddLineCommand(object obj)
{
//...
var lineVM = new LineViewModel(this);
this.Lines.Add(lineVM);
//...
} 
我假设您希望使用客户机的线路(不管是什么)。您需要一个包含
行的属性

public ObservableCollection<LineViewModel>{get;}
publicobservableCollection{get;}

在保存父对象(在您的案例中是
客户端
)时,您还保存了所有子对象。

这就是我最后所做的:

创建了一个存储库类 在其中,我只使用一个singelton初始化它一次,所有视图模型都可以访问它 :

在属性clientId(在xaml中有一个绑定)中的Client ViewModel类中,我输入新的clientId

    private string _clientId;

    public string ClientId
    {
        get { return _clientId; }
        set
        {
            _clientId = value;
            RaisePropertyChanged();
            UIRepository.Instance.CurrentClientId = ClientId;
        }
    }
然后,我在客户机类中添加了一个命令,当我更改到新视图时,该命令将输入clientId(通过对Visibility属性使用绑定:

    private void OnAddLineCommand(object obj)
    {
        MainWindowViewModel.Instance.ShowCRMClient = false;
        MainWindowViewModel.Instance.ShowCRMLine = true;

        UIRepository.Instance.CurrentClientId = ClientId;

    }

就这些

这就是我最后做的:

创建了一个存储库类 在其中,我只使用一个singelton初始化它一次,所有视图模型都可以访问它 :

在属性clientId(在xaml中有一个绑定)中的Client ViewModel类中,我输入新的clientId

    private string _clientId;

    public string ClientId
    {
        get { return _clientId; }
        set
        {
            _clientId = value;
            RaisePropertyChanged();
            UIRepository.Instance.CurrentClientId = ClientId;
        }
    }
然后,我在客户机类中添加了一个命令,当我更改到新视图时,该命令将输入clientId(通过对Visibility属性使用绑定:

    private void OnAddLineCommand(object obj)
    {
        MainWindowViewModel.Instance.ShowCRMClient = false;
        MainWindowViewModel.Instance.ShowCRMLine = true;

        UIRepository.Instance.CurrentClientId = ClientId;

    }

仅此而已,
CRMClientViewModel
维护一个引用(即属性或ObservableCollection)到Line ViewModel?什么是
AddLineCommand
?Fer Garcia-他们在同一个命名空间中,如果你是指一个共同属性,那么不,他们只有一个共享的BaseViewModel请在问题中编辑代码,而不是作为注释。这看起来不像是实际添加了一行。那么最后如何添加该行?@Ilanz,嗯,我没有hink您的ViewModel需要这样一个引用;即,如果没有该类的实例(即使它们共享名称空间),该怎么办?或者,您正在使用服务定位器或类似技术吗?我同意grek40,您需要显示更多代码。
CRMClientViewModel
维护一个引用(即属性或ObservableCollection)到Line ViewModel?什么是
AddLineCommand
?Fer Garcia-他们在同一个命名空间中,如果你是指一个共同属性,那么不,他们只有一个共享的BaseViewModel请在问题中编辑代码,而不是作为注释。这看起来不像是实际添加了一行。那么最后如何添加该行?@Ilanz,嗯,我没有hink您的ViewModel需要这样一个引用;即,如果没有该类的实例(即使它们共享名称空间),该怎么办?或者,您使用的是服务定位器或类似的技术吗?我同意grek40,您需要显示更多的代码。