2013-04-21 55 views
0

我有WPF应用Prism和mvvm体系结构在1模块我有一个树视图和其他模块我有textbox.Both模块加载正常。 我想要做的是 - 点击treeview节点。 - 在viewmodel中设置当前选定的对象。 - 也发生事件(或其他事件)并将节点值设置为其他模块中的文本框设置属性从其他模块棱镜

前两点正常工作。 它的第三我不能弄清楚。

这是我的treeview代码。

<TreeView Name="TreeViewTest" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Path= TestObservable}"> 

     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}">     
        <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Name}" Tag="{Binding Id}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

代码我在哪里设置选定的对象。

private bool _selected = false; 
    public bool IsSelected 
    { 
     get 
     { 
      return _selected; 
     } 
     set 
     { 
      if (_selected == value) return; 
      _selected = value; 
      NotifyPropertyChanged("IsSelected"); 
      this._selectedItem = this;    
      RaisePropertyChanged(() => Name); 

     } 
    } 

并且viewmodel isSelected是实际绑定树视图模块的主视图模型的子Viewmodel。

这个消息是绝对如下

public interface ITreeViewModel 
{ 
    ITreeViewModelView { get; } 
    ObservableCollection<IChildTreeViewModel> TestObservable{ get; set; } 

} 

任何帮助将是巨大的

回答

1

好,棱镜说,我有一个模块之间的通讯四种方式:(事件聚合,共享服务,地区的Contex和指挥)我通过Container添加另一种方式共享对象。 不过,我相信你的情况最好的是(事件聚合或者通过集装箱共享

事件聚合:

1)定义在一个项目中的事件,所有模块访问它(基础设施.dll for instanse)。 这个事件必须继承形式CompositePresentationEvent。 YourObjectClass是要模块之间传输的类的数据:

namespace Infrastructure 
{ 
public class ObjectChangedEvent: CompositePresentationEvent<YourObjectClass> 
{  
} 

2)注入的情况下聚合器源和目标模块的视图模型

IEventAggregator _eventAggregator; 
    private readonly IRegionManager _regionManager; 
    private readonly IUnityContainer _container; 
    private Creator _creator; 

    public NavigationViewModel(IEventAggregator eventAggregator, IRegionManager regionManager, IUnityContainer container) 
    { 
     _eventAggregator = eventAggregator; 
     _regionManager = regionManager; 
     _container = container; 
    } 

3)从源发布所定义的事件视图模型,因为目标视图模型已经订阅了它。 目标视图模型:

eventAggregator.GetEvent<UnCheckEvent>().Subscribe(CheckHandler); 
源视图模型

eventAggregator.GetEvent<UnCheckEvent>().Publish(YourObject); 

4)很明显,最后你应该实现CheckHandler方法,得到您的对象,你可以将其设置为属性绑定到您的文本框。我希望这可以帮助