ContentPresenter未正确更新显示

时间:2013-10-28 19:52:27

标签: c# wpf treeview contentpresenter

在我程序的主窗口中,我有一个TreeView和一个ContentPresenterContentPresenter的显示取决于TreeView中选择的节点。

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

contentMenu中选择新名称时会出现此问题。 ContentPresenter的显示会发生变化,但应该只在用户选择其他节点(更改显示)后再重新选择原始节点。

ContentPresenter节点的名称发生更改时,如何使TreeView上的显示更改?

TreeViewViewModel:

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") {...}
          }
     }
}

2 个答案:

答案 0 :(得分:0)

Duh,这很多代码很难理解你的内容,因为你似乎在ViewModel中有控件。

或者至少在我看来你在ViewModel中拥有它们。这不是MVVM - 我的朋友。 :)

“当从contentMenu中选择一个新名称时会出现问题.InitualPresenter的显示会像它应该的那样改变,但只有在用户选择不同的节点(更改显示)之后才会改变,然后重新选择原始节点。“

由于新选择的值等于旧值,因此未触发属性更改。

非常明显,对吧?......实际上没有任何财产被改变

但是为什么你希望ContentPresenter用它已有的值更新自己?

您说当您选择一个节点时,ContentPresenter会正确显示它,当您重新选择该节点时,ContentPresenter没有做任何事情。

它没有做任何事情,因为它认为它不需要。这是真的。

所以问题是为什么你会让ContentPresenter强制刷新每个值,无论旧值是否与新值相同?

虽然如果你想要进行黑客攻击/欺骗,你可以在分配另一个值之前将ContentPresenter的内容设置为null。 :)

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

答案 1 :(得分:0)

我能够通过从TreeViewViewModel调用MainWindowViewModel中的ChangeViews();来解决此问题。我通过在TVVM中使用委托属性并将其添加到我的MWVM来完成此操作。通过这样做,只要调用ChangeViews();,就会更新显示。

This是我用过的答案。