我在一个模块中有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; }
}
任何帮助都会很棒
答案 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方法,然后将其设置为绑定到文本框的属性。
我希望这可以帮助