在我程序的主窗口中,我有一个TreeView
和一个ContentPresenter
。 ContentPresenter
的显示取决于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") {...}
}
}
}
答案 0 :(得分:0)
Duh,这很多代码很难理解你的内容,因为你似乎在ViewModel中有控件。
或者至少在我看来你在ViewModel中拥有它们。这不是MVVM - 我的朋友。 :)
“当从contentMenu中选择一个新名称时会出现问题.InitualPresenter的显示会像它应该的那样改变,但只有在用户选择不同的节点(更改显示)之后才会改变,然后重新选择原始节点。“
由于新选择的值等于旧值,因此未触发属性更改。
非常明显,对吧?......实际上没有任何财产被改变
但是为什么你希望ContentPresenter用它已有的值更新自己?
您说当您选择一个节点时,ContentPresenter会正确显示它,当您重新选择该节点时,ContentPresenter没有做任何事情。
它没有做任何事情,因为它认为它不需要。这是真的。
所以问题是为什么你会让ContentPresenter强制刷新每个值,无论旧值是否与新值相同?
虽然如果你想要进行黑客攻击/欺骗,你可以在分配另一个值之前将ContentPresenter的内容设置为null。 :)
但是,向我们发送更多代码,我们将能够为您提供更好的解决方案。
答案 1 :(得分:0)
我能够通过从TreeViewViewModel调用MainWindowViewModel中的ChangeViews();
来解决此问题。我通过在TVVM中使用委托属性并将其添加到我的MWVM来完成此操作。通过这样做,只要调用ChangeViews();
,就会更新显示。
This是我用过的答案。