2013-04-21 50 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方法,得到您的對象,你可以將其設置爲屬性綁定到您的文本框。我希望這可以幫助