2

私はこの奇妙な問題に遭遇してきましたが、それを解決する方法がわからないようです。

WPFアプリケーションを作成していて、リストボックスに値を読み込んでいます。具体的には、このリストボックスには、クライアントマシンの起動順序が表示されています。したがって、リストボックスアイテムテンプレートは4つの値を保持します。新しいシーケンス番号(ユーザーが変更した後の起動順序)現在の(または割り当てられた)シーケンス番号(マシンの現在の順序)、デバイス名、およびデバイスが有効になっているかどうか。

このデータは別のスレッドに読み込まれるため、リストボックスに表示するためにディスパッチャーを使用します。

この質問の目的のために、Deviceが割り当てられたシーケンスとデバイス名を保持するクラスであるListデバイスが存在します。

bootOrderListBoxは、ListBoxUI要素です。

現在のループは次のようになります。

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にリダイレクトされています(これもディスパッチャーを使用しています)。

私の問題は、newSeqNumが「コンソール」とリストボックスの両方で定数1の値であるが、コードはデバイスリストを完全に通過することです。

これを引き起こす原因は何でしょうか。また、それを修正するにはどうすればよいですか。

私の考えでは、Dispatcherを実行すると、別のスレッドにデフォルト値などの新しいintが作成されると思います。

どうもありがとう。

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

リストボックス(およびコンソール)の出力は次のようになります。

新しいシーケンス割り当てシーケンスデバイス名

1 2ディスケットドライブ:1

1 1 USBストレージデバイス:3

1 3オンボードNIC:5

1 4内蔵HDD: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 に答える