2013-10-28 68 views
0

在我的程序主窗口中,我有一個TreeViewContentPresenterContentPresenter的顯示由TreeView中選擇的節點決定。ContentPresenter無法正確更新顯示

我的一個節點的名稱可以由用戶通過contentMenu更改。所有用戶必須做的是右鍵單擊該節點並從選項中選擇新名稱。在用戶爲節點選擇名稱之前,ContentPresenter應該具有空顯示。

contentMenu中選擇一個新名稱時會出現該問題。 ContentPresenter的顯示屏會像它應該那樣改變,但只有在用戶選擇不同的節點(更改顯示屏)之後,然後重新選擇原始節點。

如何更改TreeView節點的名稱使ContentPresenter上的顯示更改爲正確?

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

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

回答

0

Duh,這是很多代碼,因爲你在ViewModel中似乎擁有控件,所以很難理解你所要做的。

或者至少在我看來,你有他們在ViewModel。這不是MVVM,就像我的朋友一樣。 :)

「當從contentMenu中選擇一個新名稱時,會出現問題。ContentPresenter的顯示會發生變化,就像它應該那樣,但只有在用戶選擇不同的節點(更改顯示)之後,再重新選擇原始節點「。

由於新選定的值等於舊值,因此未更改屬性。

很明顯的,對不對?......沒有財產,實際上改變

但是,爲什麼你希望ContentPresenter本身與它的值已經更新?

你說過當你選擇一個節點時,ContentPresenter正確顯示它,當你重新選擇相同的ContentPresenter時,它沒有做任何事情。

它沒有做任何事情,因爲它認爲它不需要。這是真的。

所以問題是,爲什麼要讓ContentPresenter強制刷新每個值,而不管舊值是否與新值相同?

儘管如果您想要進行一些破解/竅門,您可以在分配另一個值之前始終將ContentPresenter的內容設置爲null。:)

但是,向我們發佈更多代碼,我們將能夠爲您提供更好的解決方案。

+0

我只想做一些說明:首先,我的ViewModel中沒有控件,「LeftWidget」是綁定到ContentPresenter內容的屬性。其次,我想再次解決這個問題,因爲它看起來不像我解釋得那麼好 - 當節點被選中並且名稱是「未知」時,ContentPreseter是空白的。用戶更改名稱,節點仍處於選中狀態,但面板保持空白(應顯示新面板)。只有當用戶解除節點,選擇新節點並重新選擇主節點時,纔會顯示新面板。 –

+0

所以基本上你必須點擊其他東西,然後在ContentPresenter中的Content變化之前返回。 –

0

我能夠通過在我的TreeViewViewModel的MainWindowViewModel中調用ChangeViews();來解決此問題。我通過在TVVM中使用委託屬性來完成此操作,並將其添加到我的MWVM中。通過這樣做,只要調用ChangeViews();就會更新顯示。

This是我用過的答案。