我一直遇到这个奇怪的问题,我似乎无法找到解决它的方法。
我正在编写一个 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;
}
}