0

私のプログラムのメイン ウィンドウには、TreeViewと がありContentPresenterます。の表示は、ContentPresenterで選択されているノードによって決まりますTreeView

ノードの 1 つの名前は、ユーザーが を介して変更できますcontentMenu。ユーザーがしなければならないことは、ノードを右クリックして、選択肢の中から新しい名前を選択することだけです。ユーザーがノードのContentPresenter名前を選択するまでは、null 表示が想定されています。

から新しい名前を選択すると、問題が発生しcontentMenuます。のContentPresenter表示は、本来あるべきように変更されますが、ユーザーが別のノードを選択して (表示を変更して)、元のノードを再度選択した後にのみ変更されます。

ノードの名前が変更されContentPresenterたときに表示が変わるようにするにはどうすればよいですか?TreeView

ツリービュービューモデル:

public class TreeViewViewModel : PropertyChangedBase
{
     public TreeViewViewModel()
     {
          Node = new Node() { NodeName = "Blank", NodeDataModel = new NodeModel(),
                Commands = { new Command(nodeType_name1), new Command(nodeType_name2) } };
     }

     //These functions call to the NodeName property in the TreeView's Data Model
     private void nodeType_name1()
     {
          Node.NodeName = "Name1";
     }

     private void nodeType_name2()
     {
          Node.NodeName = "Name2";
     }
}

MainWindow の XAML:

<!-- Tree view items & Functions -->
<TreeView Name="Tree_One" ItemsSource="{Binding DataTree.Data}" ... >
     <TreeView.Resources>
           <SolidColorBrush Color="LightSkyBlue" x:Key="{x:Static SystemColors.HighlightBrushKey}" />
     </TreeView.Resources>
 </TreeView>

 <!--- Left Widget -->
 <ContentPresenter Content="{Binding LeftWidget}" />

MainWindowViewModel:

public class MainWindowViewModel : PropertyChangedBase
{
     private TreeViewViewModel _dataTree;

     public MainWindowViewModel()
     {
          _dataTree = new TreeViewViewModel();
     }

     public TreeViewViewModel DataTree { ... }

     //This function is in charge of changing the display of the ContentPresenter
     // I think that my problem can probably be solved by doing something here
     public void ChangeViews()
     {
          if (_dataTree.SelectedItem is Node)
          {
               var _node = _dataTree.SelectedItem as Node;
               var nodeViewModel = new NodeViewModel(_node.NodeDataModel);

               if (_node.NodeName== "Unknown")
                    LeftWidget = null; //This is the Content Presenter **
               if (_node.NodeName == "Name1")
               {
                   LeftWidget = nodeViewModel;
               }

               if (_node.NodeName == "Name2") {...}
          }
     }
}
4

2 に答える 2

0

まあ、それはたくさんのコードで、ViewModel にコントロールがあるように見えるので、何をしようとしているのかを理解するのはかなり難しいです。

または、少なくともViewModelにそれらがあるように見えます。それは私の友人のMVVMにあまり似ていません。:)

「この問題は、contentMenu から新しい名前が選択されたときに発生します。ContentPresenter の表示は、本来のように変更されますが、ユーザーが別のノードを選択して (表示を変更して)、元のノードを再選択した後にのみ変更されます。」

新しく選択された値が古い値と等しいため、変更されたプロパティは起動されません。

かなり明白ですよね?...実際に変更されたプロパティはありません

しかし、ContentPresenter が既に持っている値でそれ自体を更新する必要があるのはなぜでしょうか?

ノードを選択すると ContentPresenter はそれを適切に表示し、同じものを再選択すると ContentPresenter は何もしていないと言いました。

何もする必要がないと思うので、何もしていません。これは本当です。

問題は、古い値が新しい値と同じであるにもかかわらず、ContentPresenter が各値を強制的に更新するようにする理由です。

ただし、少しハック/トリックしたい場合は、別の値を割り当てる前に、いつでも ContentPresenter のコンテンツを null に設定できます。:)

ただし、より多くのコードを投稿していただければ、問題に対するより良い解決策を提供できるようになります。

于 2013-10-28T20:42:40.620 に答える
0

ChangeViews();TreeViewViewModel から MainWindowViewModel を呼び出すことで、この問題を解決できました。これは、TVVM でデリゲート プロパティを使用し、それを MWVM に追加することで実現しました。ChangeViews();これにより、が呼び出されるたびに表示が更新されます。

これは私が使用した答えです。

于 2013-10-29T14:17:31.840 に答える