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