【发布时间】:2013-08-27 23:49:31
【问题描述】:
在我的程序中,我有一个TreeViewItem,它的Header 设置为数字integer 值。为了将Header 转换为直接的int 值,我将其传递给一个名为getNumber 的函数。
我的getNumber 功能:
这个函数来自this previously asked question。
//Gets the number contained in a Node's header
public static int getNumber(string parentNodeHeader)
{
int curNumber = 0;
Int32.TryParse(parentNodeHeader, out curNumber);
return curNumber;
}
我在程序的几个不同区域中以相同的方式传递给这个函数,但在其中一个区域中,string 没有正确传递。在调试器中,它 (parentNodeHeader) 将 "System.Windows.Controls.StackPanel" 显示为它的值而不是数字。我不知道为什么会这样。
对于函数的有效调用以及无效调用,我使用相同的代码。
int curNumber = getNumber(SelectedItem.Header.ToString());
为什么会发生这种情况,我该如何解决?
更新:
我已经通过添加这个更改了对 getNumber 函数的调用...
var selectedHeader = (TextBlock)SelectedItem.Header; //The header is now a TextBlock
int curNumber = getNumber(selectedHeader.Text);
理论上这应该可行,但我收到一个InvalidCastException,它说它无法将StackPanel 转换为TextBlock。 StackPanel 来自哪里……?
感谢您的帮助。
【问题讨论】:
-
你还记得我告诉过你UI is not Data 并且你不应该阅读 UI 元素的属性吗?如果你听从了我的建议,而不是所有这些可怕的类似 winform 的黑客攻击,那么你现在已经完成了你的应用程序(两次)。
-
相信你刚刚被骂了
-
@HighCore 我认为你是一个能说出自己想法的人,我很感激。然而,对我来说,你称我的代码是什么并不重要。我明白你在说什么,但我已经取得了比从最底层学习 MVVM 所取得的更多进展。我现在知道我的程序,我知道如何引用它里面的元素,所以这就是我关心的。
-
@Ericafterdark 加上,盲目地编写越来越多的代码,而不是应用适当的模式会导致糟糕的设计,完全臃肿,可能 90% 的代码可以被简单的绑定替换。
-
你传入了一个
StackPanel对象并在其上调用ToString()。StackPanel没有有意义的“文本”或“字符串”概念,因此使用报告其类型名称的默认行为。您需要访问并传递某种TextBox控件(或包含在StackPanel中的任何UI 控件,其中包含您要解析的文本)。此外,您应该不将0作为默认值分配给curNumber;它被Int32.TryParse方法丢弃了。
标签: c# wpf string header treeviewitem