【发布时间】:2019-09-19 03:31:20
【问题描述】:
我在 Visual Studio 2010 应用程序中有以下 WPF 和 C# 摘录。当我运行我的应用程序并说内容是“{DisconnectedItem}”时,此代码被捕获在异常中。对我来说,这意味着我的“loadDesc”函数正在为当前不在 ListView 视图内的对象(复选框)调用。为什么是这样?任何帮助表示赞赏。
C# 和 WPF 代码如下:
private void loadDesc(object sender, RoutedEventArgs e)
{
try
{
string num = (string)(((sender as TextBlock).Parent as StackPanel).Children[0] as CheckBox).Content;
if (num == null)
{
return;
}
if (num.Equals("Tamper"))
{
(sender as TextBlock).Text = "";
}
else
{
int x = Convert.ToInt32(num);
dc.ext247[x - 1].desc = ZoneDescriptionsVM.getInstance().zoneDesc[x - 1].description.Trim();
dc.onOff247[x - 1].desc = ZoneDescriptionsVM.getInstance().zoneDesc[x - 1].description.Trim();
}
}
catch (Exception ex)
{
MessageBox.Show((((sender as TextBlock).Parent as StackPanel).Children[0] as CheckBox).Content.ToString());
}
}
<ListView KeyboardNavigation.TabNavigation="Continue" VirtualizingStackPanel.VirtualizationMode="Recycling" BorderThickness="0" Width="260" MaxHeight="400" Margin="10" Name="zonesOnOffStack" SelectionMode="Single">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Visibility="{Binding visible}" IsChecked="{Binding enabled}" Content="{Binding name}" />
<TextBlock Padding="5,-1,0,0" Loaded="loadDesc" Text="{Binding desc, StringFormat={}({0})}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListView>
【问题讨论】:
-
无论您在这里做什么,都应该在 ViewModel 级别而不是在代码后面进行。
-
错误消息(和堆栈跟踪)说什么?请改用
MessageBox.Show(ex.ToString());。 -
@HighCore:你能解释一下怎么做吗?目前,我正在将一个 ViewModel 中的描述(文本)加载到此处显示的该视图中(链接到不同的 ViewModel)。我这样做是为了让我需要访问的 ViewModel 全局使用单例模式,这样我就可以在其他 ViewModel 中简单地调用 .getInstance()。
-
我面前没有发生错误的计算机。它只发生在 Windows XP 经典主题上。如果在带有彩色开始菜单主题的 Windows 7 或 XP 上,则不会出现任何错误。但我确实尝试过 ex.ToString() 并且我记得它说的是“无法将未命名的对象转换为字符串”。因此我打印出了应该是字符串内容的内容,发现它是一个断开连接的项目
标签: c# wpf listview virtualization