2017-02-15 50 views
2

我有一个WorkspaceViewModel,通过ObservableCollection动态添加和删除选项卡项目。每次选项卡连接到PayslipModel时,所有绑定都可以正常工作,但我遇到的一个问题是:wpf - 与模型的多个实例交互的一个ViewModel

我在UserControl中的DataContext设置为WorkspaceViewModel的保存按钮,我想保存任何信息显示在选定的选项卡。现在,每次添加一个选项卡时,都会创建一个PayslipModel的新实例,这正是我想要的,因为我不希望为所有选项卡共享绑定。但是,由于PayslipModel有多个实例,因此我无法保存正在显示的内容,因此当我点击保存时没有任何内容返回(暂时使用MessageBox测试是否正在检索信息)。

我创建了一个图,以更好地解释我的情况: enter image description here

是否有可能在选择一个标签,或者通过所有实例周期和执行类似的批量保存访问当前实例?

+0

TabControl.Selected .DataContext为PaySlipModel? – 0x4f3759df

+1

ItemsControls有一个ItemsSource和SelectedItem。在TabControl中SelectedItem是当前显示的选项卡。这还不足以告诉你哪个PayslipModel正在被编辑? – Will

+0

@我想通过ViewModel实现保存,因为我使用命令绑定按钮。这是否意味着对于这种特殊情况,它不能通过ViewModel来完成? – bruh1234

回答

0

这是一个工作示例,其示出了possiblities之一:

查看

<TabControl DataContext="{Binding}" ItemsSource="{Binding Models}" > 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" > 
       </TextBlock> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <Button DockPanel.Dock="Top" Content="Click Me" Command="{Binding DataContext.PCommand, 
                  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabControl}}" 
          CommandParameter="{Binding Desc}"/> 
        <TextBlock Text="{Binding Desc}" > 
        </TextBlock> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 

模型视图

public class ModelView 
{ 
    public ModelView() 
    { 
     _models = new ObservableCollection<Model>(); 
     _pCommand = new Command(DoParameterisedCommand); 
    } 
    ObservableCollection<Model> _models; 
    public ObservableCollection<Model> Models { get { return _models; } } 

    private void DoParameterisedCommand(object parameter) 
    { 
     MessageBox.Show("Parameterised Command; Parameter is '" + 
        parameter.ToString() + "'."); 
    } 
    Command _pCommand; 
    public Command PCommand 
    { 
     get { return _pCommand; } 
    } 
} 

模型

public class Model : INotifyPropertyChanged 
{ 
    string _desc; 
    public string Desc { get { return _desc; } set { _desc = value; RaisePropertyChanged("Desc"); } } 

    string _name; 
    public string Name { get { return _name; } set { _name = value; RaisePropertyChanged("Name"); } } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void RaisePropertyChanged(string propname) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname)); 
    } 
} 

命令

public class Command : ICommand 
{ 
    public Command(Action<object> parameterizedAction, bool canExecute = true) 
    { 
     _parameterizedAction = parameterizedAction; 
     _canExecute = canExecute; 
    } 


    Action<object> _parameterizedAction = null; 
    bool _canExecute = false; 
    public bool CanExecute 
    { 
     get { return _canExecute; } 
     set 
     { 
      if (_canExecute != value) 
      { 
       _canExecute = value; 
       CanExecuteChanged?.Invoke(this, EventArgs.Empty); 
      } 
     } 
    } 
    public event EventHandler CanExecuteChanged; 
    bool ICommand.CanExecute(object parameter) 
    { 
     return _canExecute; 
    } 

    void ICommand.Execute(object parameter) 
    { 
     this.DoExecute(parameter); 
    } 
    public virtual void DoExecute(object param) 
    { if (_parameterizedAction != null) 
      _parameterizedAction(param); 
     else 
      throw new Exception(); 
    } 


} 

使用此初始化:

public MainWindow() 
    { 
     InitializeComponent(); 
     ModelView mv = new ModelView(); 
     mv.Models.Add(new Model() { Name = "a", Desc = "aaa" }); 
     mv.Models.Add(new Model() { Name = "b" , Desc = "bbb"}); 
     mv.Models.Add(new Model() { Name = "c", Desc = "cccc" }); 
     this.DataContext = mv; 

    } 
相关问题