在viewmodels之间传递属性

时间:2016-11-28 07:06:31

标签: c# wpf

我经历了类似的问题,但我没有找到适合我的代码的答案。我正在尝试使用WPF将数据(客户端类型Id)从名为Client的视图模型传递到View Model Named(每个客户端都有多行,因此我输入的行应该知道哪个客户端是所有者)

更新:AddCommand

这是客户代码:

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从客户端视图传递到线视图模型

2 个答案:

答案 0 :(得分:0)

如果我理解得对,你想拥有一个经典的Master-Detail-view又称为亲子。

你可以传递&#34;父母&#34;给你的孩子&#34;在构造函数中。

void OnAddLineCommand(object obj)
{
//...
var lineVM = new LineViewModel(this);
this.Lines.Add(lineVM);
//...
} 

我假设您想要使用客户端的行(无论是什么)。您需要一个包含Line s

的属性
public ObservableCollection<LineViewModel>{get;}

保存父级(在您的情况下为Client)时,您也会保存所有孩子。

答案 1 :(得分:0)

这就是我最后的所作所为:

创建了一个存储库类 我把一个singelton放到Init只有一次,所有的视图模型都可以获得Access :

 public class UIRepository
 {
    private static volatile UIRepository instance;
    private static object syncRoot = new Object();

    private UIRepository(){}
    public static UIRepository Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new UIRepository();
                }
            }

            return instance;
        }
    }

    private string _currentClientId;

    public string CurrentClientId
    {
        get { return _currentClientId; }
        set { _currentClientId = value; }
    }}

在属性clientId中的Client ViewModel类中(在xaml中有绑定)我输入new clientId

    private string _clientId;

    public string ClientId
    {
        get { return _clientId; }
        set
        {
            _clientId = value;
            RaisePropertyChanged();
            UIRepository.Instance.CurrentClientId = ClientId;
        }
    }

然后我在客户端类中添加了一个命令,当我更改为新视图时进入clientId(通过使用可见性属性上的绑定:

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

        UIRepository.Instance.CurrentClientId = ClientId;

    }

多数人