0

我在 1 个模块中有带有 Prism 和 mvvm 架构的 wpf 应用程序,我有一个树视图,在其他模块中我有文本框。两个模块都正确加载。我想做的是-单击树视图节点。- 在视图模型中设置当前选定的对象。- 也触发一个事件(或其他东西)并将节点值设置为其他模块中的文本框

前两点工作正常。这是我想不通的第三个。

这是我的树视图代码。

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

所以如下

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

}

任何帮助都会很棒

4

1 回答 1

1

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

事件聚合器:

1)在项目中定义一个所有模块都可以访问它的事件(Infrastructure.dll 用于实例)。此事件必须继承表单 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 方法来获取你的对象,你可以将它设置为绑定到你的 textbox 的属性。

我希望这会有所帮助

于 2013-04-21T11:34:15.477 回答