2016-01-07 3 views
0

Я новичок в WPF. Проект, над которым я работаю, имеет требования использовать VB в качестве языка и плоских файлов в качестве данных (я не могу изменить требования). Я только нашел (2) книги по WPF с VB по сравнению с десятками в C, а поиски в Интернете были такими же скудными. Надеясь, что кто-то есть, есть кое-какие сведения по этому вопросу с опытом VB.WPF/VB ComboBox SelectionChanged Fire Дважды

Это каскадное событие на странице. Я загружаю выпадающее поле со списком. Когда выбор производится в блоке, он делает доступным комбобокс объекта и загружает данные на основе выбранного значения единицы. Если блок снова изменится, он очистит поле объекта и перезагрузится на основе нового значения единицы.

Мой код ниже. Что действительно меня смущает, так это результаты загрузки комбобокса объекта. Он загружается, как если бы чтение плоского файла зацикливалось дважды. В верхней части функции находится код для очистки списка перед загрузкой combobox. Таким образом, если даже если функция была вызвана дважды, код должен технически очистить список, загрузить, снова очистить список и загрузить. Я ввел ряд всплывающих окон, чтобы подтвердить, что SelectionChange вызывается дважды, и поэтому средство загрузки вызывается дважды.

Я посмотрел на аргументы отправителя и e, и они одинаковы в обоих вызовах, поэтому я не уверен, как улавливать и останавливать второй вызов или что даже запускает его.

О, действительно странная вещь произошла с всплывающими окнами. Если они теперь размещены в коде VB, проблема исчезнет. Я вижу только одно появление объекта в поле со списком. Если я заберу всплывающие окна, я снова получу два события.

Кто-нибудь видит то, что мне не хватает? Заранее благодарим за отзыв и помощь.

XAML:

<Grid x:Name="gridTreat1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <TextBlock x:Name="lblTreat1Title" HorizontalAlignment="Left" Margin="22,20,0,0" TextWrapping="Wrap" Text="Treatment Details  1 of 3" VerticalAlignment="Top" Width="459" FontSize="36" FontWeight="Bold"/> 
    <TextBox x:Name="lblUnit" Text="Unit:" HorizontalAlignment="Left" Margin="66,95,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/> 
    <ComboBox x:Name="cboUnit" HorizontalAlignment="Left" Margin="234,95,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="18" SelectionChanged="cboUnit_SelectionChanged"> 
    </ComboBox> 
    <TextBox x:Name="lblFacility" Text="Facility:" HorizontalAlignment="Left" Margin="66,202,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/> 
    <ComboBox x:Name="cboFacility" HorizontalAlignment="Left" Margin="234,202,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="16" SelectionChanged="cboFacility_SelectionChanged"> 
    </ComboBox> 
    <TextBox x:Name="lblPhysician" Text="Physician:" HorizontalAlignment="Left" Margin="66,256,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/> 
    <ComboBox x:Name="cboPhysician" HorizontalAlignment="Left" Margin="234,256,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="16"> 
    </ComboBox> 
    <TextBox x:Name="lblStep2" Text="------------------------------------------------------------------------------------------------------" HorizontalAlignment="Left" Margin="66,153,0,0" VerticalAlignment="Top" Width="754" Height="34" FontSize="18" FontWeight="Bold" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/> 
    <Button x:Name="cmdCancel" Content="Cancel" HorizontalAlignment="Left" Margin="104,502,0,0" VerticalAlignment="Top" Width="165" Height="50" FontSize="18" /> 
    <Button x:Name="cmdNext" Content="NEXT &gt;&gt;" HorizontalAlignment="Left" Margin="618,502,0,0" VerticalAlignment="Top" Width="165" Height="50" FontSize="18"/> 
    <Rectangle x:Name="recPatient" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="57" Margin="544,18,0,0" Stroke="Black" VerticalAlignment="Top" Width="329"/> 
    <TextBox x:Name="lblPRN" Text="PRN:" HorizontalAlignment="Left" Margin="550,20,0,0" VerticalAlignment="Top" Width="42" Height="20" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" IsReadOnly="True" IsTabStop="False" TabIndex="0"/> 
    <TextBox x:Name="lblPatName" Text="Patient:" HorizontalAlignment="Left" Margin="550,41,0,0" VerticalAlignment="Top" Width="70" Height="20" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/> 
    <TextBox x:Name="txtPRN" HorizontalAlignment="Left" Height="11" Margin="625,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="235" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontWeight="Bold" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/> 
    <TextBox x:Name="txtPatName" HorizontalAlignment="Left" Height="27" Margin="625,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="235" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontWeight="Bold" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/> 
    <TextBox Text="CONFIDENTIAL PEER REVIEW PRIVILEGED" HorizontalAlignment="Left" Margin="290,558,0,0" VerticalAlignment="Top" FontWeight="Bold" Foreground="Red" BorderBrush="White" FontSize="14" IsTabStop="False" TabIndex="0" IsReadOnly="True"/> 
    <TextBox x:Name="txtTest" HorizontalAlignment="Left" Margin="423,399,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"/> 
    <TextBox x:Name="txtTest2" HorizontalAlignment="Left" Margin="423,436,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"/> 
</Grid> 

VB код Сзади:

Private Sub cboUnit_SelectionChanged(sender As System.Object, e As SelectionChangedEventArgs) Handles cboUnit.SelectionChanged 
    Dim myUnit As String = "" 
    Dim cb As ComboBox 
    Dim cbi As ComboBoxItem 
    cb = CType(cboUnit, ComboBox) 
    cbi = CType(cb.SelectedItem, ComboBoxItem) 
    myUnit = cbi.Tag.ToString 
    Select Case GlobalVariable.gvAction 
     Case "A" 
      Call Load_cboFacility(myUnit) 
      Me.cboFacility.Visibility = Xaml.Visibility.Visible 
      Me.lblFacility.Visibility = Xaml.Visibility.Visible 
     Case "E" 
      Call Load_cboFacility(myUnit,"2") 
    End Select 
End Sub 

Private Async Sub Load_cboFacility(ByVal myUnit As String, Optional myIsSel As String = "") 
    Dim nextline As String = "" 
    Dim myTag As String = "" 
    Dim myKey As String = "" 
    Dim myContent As String = "" 
    Dim localfolder As Windows.Storage.StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder 
    Dim myfile As StorageFile = Await localfolder.GetFileAsync("dicFacility.txt") 

    Dim cb As ComboBox 
    Dim cbi As ComboBoxItem 
    Dim myMsg2 As New MessageDialog("1") 
    Await myMsg2.ShowAsync 

    cb = CType(cboFacility, ComboBox) 
    cb.Items.Clear() 

    Using reader As StreamReader = New StreamReader(Await myfile.OpenStreamForReadAsync) 
     Dim myMsg As New MessageDialog("2") 
     Await myMsg.ShowAsync 
     nextline = Await reader.ReadLineAsync 
     While (nextline <> Nothing) 
      myKey = nextline.Substring(0, 2) 
      myKey = myKey.Trim 
      If myUnit = myKey Then 
       myTag = nextline.Substring(7, 4) 
       myTag = myTag.Trim 
       myContent = nextline.Substring(18, nextline.Length - 18) 
       cbi = New ComboBoxItem 
       cbi.Tag = myTag 
       cbi.Content = myContent 
       If myIsSel <> "" Then 
        If myIsSel = myTag Then 
         cbi.IsSelected = True 
        End If 
       End If 
       cb.Items.Add(cbi) 
      End If 
      nextline = Await reader.ReadLineAsync 
     End While 
    End Using 

End Sub 

Пересмотр вопроса:

я, наконец, получил код работает как вариант того, что я думаю, что Рэйчел предложила Я делаю. Это не изящно, а работает. Если кто-то имеет более чистый путь, я открыт для предложений:

Модифицированный XAML, добавив DropDownClosed событие:

<ComboBox x:Name="cboUnit" HorizontalAlignment="Left" Margin="234,95,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="18" SelectionChanged="cboUnit_SelectionChanged" DropDownClosed="cboUnit_Closed" /> 

Модифицированный VB код:

В моем файле constants.vb, я создал новую переменную, называемую gvUnitCount, и сначала установить ноль. Когда выпадающее меню закрывается, мой счетчик сбрасывается до нуля. Когда выбор изменился, он запускается один раз, и оператор IF выдает вас, если увеличивается больше.

Private Sub cboUnit_Closed(sender As System.Object, e As Object) Handles cboUnit.DropDownClosed 
    GlobalVariable.gvUnitCount = 0 
End Sub 

Private Sub cboUnit_SelectionChanged(sender As System.Object, e As SelectionChangedEventArgs) Handles cboUnit.SelectionChanged 
    Dim myUnit As String = "" 
    Dim cbUnit2 As ComboBox 
    Dim cbiUnit2 As ComboBoxItem 
    cbUnit2 = CType(cboUnit, ComboBox) 
    cbiUnit2 = CType(cbUnit2.SelectedItem, ComboBoxItem) 
    myUnit = cbiUnit2.Tag.ToString 
    Me.txtUnitTag.Text = cbiUnit2.Tag.ToString 

    If GlobalVariable.gvUnitCount = 0 Then 
     Select Case GlobalVariable.gvAction 
      Case "A" 
       Me.cboFacility.Visibility = Xaml.Visibility.Visible 
       Me.lblFacility.Visibility = Xaml.Visibility.Visible 
       Call Load_cboFacility(myUnit) 
       Me.cboPhysician.Visibility = Xaml.Visibility.Visible 
       Me.lblPhysician.Visibility = Xaml.Visibility.Visible 
       Call Load_cboPhysician(myUnit) 
      Case "E" 
       Call Load_cboFacility(myUnit) 
       Call Load_cboPhysician(myUnit) 
     End Select 
     GlobalVariable.gvUnitCount = GlobalVariable.gvUnitCount + 1 
    End If 

End Sub 

Как я уже сказал, не очень, но функции. Таким образом, я получаю только одно загрузочное средство.

+2

:(Ваш XAML делает меня печальной пандой.Тем не менее, я думаю, что я думаю, что он дважды стреляет (один раз для отмены, один раз для выбора?) И работает одновременно на отдельных потоках, поэтому .Clear вызывается дважды, затем загрузка вызывается дважды, в результате получается две копии каждого пункт. Я бы предложил добавить флаг 'isLoadingFacility', который используется для предотвращения второго вызова, если коды уже загружены. – Rachel

+0

Жаль печальная панда, я действительно сказал, что я новичок, но мне нравится ваша идея. Попробует сегодня между рейсами. Спасибо. :) – dmoody007

+0

Я попытался помечать и изменять событие DropDownClosed вместо SelectionChanged. Мой код по-прежнему создает два экземпляра в Combo Box. Во всех случаях, после изменения элемента, вызывается дважды, после чего вызывается функция load_cboFacility дважды. Мне просто не имеет смысла, что происходит. – dmoody007

ответ

0

Мое решение по-прежнему работает, кроме того, что это не самые красивые решения для кода. Предоставляя Рейчел кредит за то, что помогли мне подтолкнуть меня в направлении, чтобы заставить его работать. Не вижу способа дать ей официальный кредит, потому что она только в комментариях. Так, просто, спасибо Рейчел.

Смежные вопросы