0

在我的程序的主窗口中,我有一个TreeView和一个ContentPresenter. 的显示由在ContentPresenter中选择的节点决定TreeView

我的一个节点的名称允许用户通过contentMenu. 用户所要做的就是右键单击节点并从选项中选择新名称。在ContentPresenter用户为节点选择名称之前,应该显示为空。

当从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";
     }
}

主窗口的 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}" />

主窗口视图模型:

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 的 Content 设置为 null。:)

但是,向我们发布更多代码,我们将能够为您提供更好的解决方案来解决您的问题。

于 2013-10-28T20:42:40.620 回答
0

ChangeViews();我可以通过从 TreeViewViewModel 调用 MainWindowViewModel来解决此问题。我通过在 TVVM 中使用委托属性并将其添加到我的 MWVM 来做到这一点。通过这样做,无论何时ChangeViews();调用都会更新显示。

是我使用的答案。

于 2013-10-29T14:17:31.840 回答