Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从其他模块设置属性_C#_Wpf_Mvvm_Prism - Fatal编程技术网

C# 从其他模块设置属性

C# 从其他模块设置属性,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,我在一个模块中有一个带Prism和mvvm架构的wpf应用程序,我有一个树状视图,在另一个模块中有文本框。两个模块都正确加载。 我想做的是 -单击树视图节点。 -在viewmodel中设置当前选定的对象。 -还触发一个事件(或其他事件),并将节点值设置为其他模块中的textbox 前两点工作正常。 这是我想不出来的第三个 这是我的树视图代码 <TreeView Name="TreeViewTest" Grid.Row="1" Grid.Column="0" ItemsSource="{

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

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

这是我的树视图代码

 <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>
viewmodel isSelected是主viewmodel的子viewmodel,它实际上绑定了treeview模块

因此,它如下所示

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

}
公共接口ITreeViewModel
{
ITreeViewModelView{get;}
ObservableCollection TestObservable{get;set;}
}

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

事件聚合器:

1) 在项目中定义一个所有模块都可以访问的事件(instanse为Infrastructure.dll)。 此事件必须以经验形式呈现CompositePresentationEvent。YourObjectClass是要在模块之间传输的数据类:

namespace Infrastructure
{
 public class ObjectChangedEvent: CompositePresentationEvent<YourObjectClass>
 {       
 }
3) 从源视图模型发布定义的事件,因为目标视图模型已经订阅了该事件。 在目标视图模型中:

 eventAggregator.GetEvent<UnCheckEvent>().Subscribe(CheckHandler);
eventAggregator.GetEvent<UnCheckEvent>().Publish(YourObject);
eventAggregator.GetEvent().Subscribe(CheckHandler);
在源代码视图模型中:

 eventAggregator.GetEvent<UnCheckEvent>().Subscribe(CheckHandler);
eventAggregator.GetEvent<UnCheckEvent>().Publish(YourObject);
eventAggregator.GetEvent().Publish(您的对象);
4) 显然,最后应该实现获取对象的CheckHandler方法,并将其设置为绑定到文本框的属性

我希望这能有所帮助