2

我一直遇到这个奇怪的问题,我似乎无法找到解决它的方法。

我正在编写一个 WPF 应用程序,并且正在将值加载到 ListBox 中。具体来说,此列表框显示客户端计算机的引导顺序。所以列表框项目模板包含 4 个值。新序列号(用户更改后的引导顺序)当前(或分配的)序列号(机器现在的顺序)、设备名称以及设备是否启用。

此数据在单独的线程中加载,因此为了将其显示在列表框中,我使用了调度程序。

出于这个问题的目的,存在一个列表设备,其中设备是一个包含分配序列和设备名称的类。

bootOrderListBox 是 ListBox UI 元素。

当前循环是这样的:

for(int i=0;i<devices.Count();i++)
{
    Device device = devices.ElementAt(i);
    int newSeqNum = (device.AssignedSequence == 0) ? 0 : i + 1;
        bool isEnabled = (device.AssignedSequence == 0) ? false : true;                                    

    Console.WriteLine("\t" + newSeqNum 
                      + "\t" + 
                      device.AssignedSequence 
                      + "\t" + device.DeviceName);
    bootOrderListBox.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
    {

        bootOrderListBox.Items.Add(new BootOrderDevice(device.AssignedSequence, 
                                                       newSeqNum,
                                                       device.DeviceName,
                                                       isEnabled));
    });
}

现在由于这个应用程序的设置方式,我所有的调试都在与我开发的机器不同的机器上,但是所有控制台输出都被重定向到 UI 中的 TextBox(也使用 Dispatcher)。

我的问题是 newSeqNum 在“控制台”和 ListBox 中都是一个常量 1 值,但代码完美地通过了设备列表。

什么可能导致这种情况发生,我能做些什么来解决它?

我的想法使我相信,当 Dispatcher 运行时,它会在单独的线程上创建一个具有默认值的新 int 或类似的东西。

非常感谢。

=========================更新========================= ============================

列表框(和控制台)中的输出如下所示:

新序列分配的序列设备名称

1 2 软盘驱动器:1

1 1 USB 存储设备:3

1 3 板载网卡:5

1 4 内置硬盘:2

1 5 CD/DVD/CD-RW 驱动器:4

它肯定会从列表中获取不同的设备。

=========================更新2======================== ========================== ListBox XAML:

<ListBox Name="bootOrderListBox"
             Grid.Row="2"
             Grid.Column="1"
             Grid.ColumnSpan="4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Name="newSequenceTextBlock"
                               Text="{Binding Path=NewSequence}"
                               Margin="10,2,2,2" />
                    <TextBlock Name="assignedSequenceTextBlock"
                               Text="{Binding Path=AssignedSequence}"
                               Margin="50,2,2,2" />
                    <TextBlock Name="deviceNameTextBlock"
                               Text="{Binding Path=DeviceName}"
                               Margin="30,2,2,2" />
                    <CheckBox Name="isEnabledCheckBox"
                              IsChecked="{Binding Path=IsEnabled}"
                              Margin="10,2,2,2" 
                              Checked="isEnabledCheckBox_Checked"
                              Unchecked="isEnabledCheckBox_Unchecked"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

它绑定到的 BootOrderDevice 类:

public class BootOrderDevice
{
        public int AssignedSequence { get; set; }

        public int NewSequence { get; set; }

        public string DeviceName { get; set; }

        public bool IsEnabled { get; set; }

        public BootOrderDevice(int assSequence, int newSequence, string deviceName, bool isEnabled)
        {
            AssignedSequence = assSequence;
            NewSequence = newSequence;
            DeviceName = deviceName;
            IsEnabled = isEnabled;
        }
    }
4

2 回答 2

1

我相信这与关闭和价值捕获有关。尝试将 newSeqNum 声明移到 for 循环之外。

于 2012-07-11T20:57:41.077 回答
0

我可以看到 newSeqNum 为 1 的唯一方法是因为:

int newSeqNum = (device.AssignedSequence == 0) ? 0 : i + 1;

编译器是否将其视为:

int newSeqNum = ((device.AssignedSequence == 0) ? 0 : i) + 1;

如果分配的序列为 0,它总是会给你 1。

或者编译器是否将其视为:

int newSeqNum = (device.AssignedSequence == 0) ? 0 : (i + 1);
于 2012-07-11T16:48:48.630 回答