0

1 つのモジュールに Prism と mvvm アーキテクチャを備えた wpf アプリケーションがあり、ツリービューがあり、他のモジュールにテキストボックスがあります。両方のモジュールが正しく読み込まれています。私がやりたいことは、ツリービューノードをクリックします。-ビューモデルで現在選択されているオブジェクトを設定します。-また、イベント(または何か他のもの)を発生させ、ノード値を他のモジュールのテキストボックスに設定します

最初の 2 点は正常に機能しています。その 3 番目は私が理解できません。

これが私のツリービューコードです。

 <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);

        }
    }

ビューモデル isSelected は、ツリービュー モジュールを実際にバインドするメイン ビューモデルの子ビューモデルです。

なので以下の通り

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

}

どんな助けでも素晴らしいでしょう

4

1 に答える 1

1

Prism によると、モジュール間の通信には 4 つの方法があります: (Event Aggregator、Shared Service、Region Contex、および Commanding)。コンテナを介してオブジェクトを共有する別の方法を追加します。ただし、あなたの場合、(イベントアグリゲーターまたはコンテナーを介した共有が) 最善であると私は信じています。

イベント アグリゲーター:

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 に答える