【问题标题】:C# WPF Virtualizing ListView IssueC# WPF 虚拟化 ListView 问题
【发布时间】: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


【解决方案1】:

我看到这是旧的,所以可能没有那么有用,但我想指出一些事情。

  1. 在 VS2017 中,我设置了类似的东西并且无法重现,但我认为这是您粘贴的逐字代码
  2. 主要是, DisconnectedItem 似乎是关键,这是一个绑定表达式问题。我很好奇您使用的 xaml 版本是否不喜欢您的字符串格式不在单引号中。

证明断开连接的项目是一个绑定的东西: https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Data/BindingExpressionBase.cs,71f3b982041c21ce

希望有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多