设置属性来自其他模块棱镜

时间:2013-04-21 06:32:14

标签: c# wpf mvvm prism

我在一个模块中有prism和mvvm架构的wpf应用程序我有一个树视图,而在其他模块中我有文本框。两个模块都正确加载。 我想做的是 - 单击树视图节点。 -set当前在viewmodel中选择的对象。 - 也可以触发事件(或其他内容)并将节点值设置为其他模块中的文本框

前两点正常运作。 它是第三个我无法弄清楚的。

这是我的树视图代码。

 <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是实际绑定treeview模块的主视图模型的子Viewmodel。

所以它如下

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

}

任何帮助都会很棒

1 个答案:

答案 0 :(得分:1)

嗯,Prism说我有四种方式在模块之间进行通信:(事件聚合器,共享服务,区域上下文和命令),我还添加了另一种通过Container共享对象的方法。 但是,我相信你的情况最好的是(事件聚合器或通过Container共享。

事件聚合器:

1)在项目中定义一个事件,所有模块都可以访问它(Infrastructure.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方法,然后将其设置为绑定到文本框的属性。

我希望这可以帮助