none
SelectedItem aus ComboBox mit ItemSource Dictionary wird in Form ["1,String"] angezeigt RRS feed

  • Frage

  • Hallo Zusammen,

     

    ich habe folgende ComboBox an ein Dictionary gebunden:

    Dim dic As New Dictionary(Of Integer, String)
     dic.Add(1, "Hallo")
     dic.Add(2, "Test")
     dic.Add(3, "Server")
     Me.CmbServerName.Itemsource = dic
     Me.CmbServerName.DisplayMemberPath = "Value"
    
    
     Me.CmbServerName.SelectedValuePath = "Value"
    
    

    Das Selected Item habe ich mittels Binding an das Property gebunden:

     <ComboBox SelectedItem="{Binding SQLServerName, Mode=TwoWay}" TabIndex="1" />
    

    Das Property dazu:

     

     Private _SQLServerName As String
     Property SQLServerName As String
      Get
      Return _SQLServerName
      End Get
      Set(ByVal value As String)
      _SQLServerName = value
      Changed("SQLServName")
      End Set
     End Property
    
    


    Alles funzt wunderbar.. das Property ist drin, wie es sein soll... Allerdings ist im String alles aus dem Dictionary auch der Key im SelectedItem mit drin..sprich Key + Value, obwohl ich SelectedValuePath ="Value" gesetzt habe.

    Also der String ist = "[1, Hallo]"

     

    Ich brauche aber nur den Namen sprich den eigentlichen Value..

    Was habe ich vergessen?

     

    Danke

    Torsten

     

     

     



    • Bearbeitet Pattasatto Samstag, 2. Juli 2011 09:03 Ausdrucksfehler korrigiert
    Donnerstag, 30. Juni 2011 15:26

Antworten

  • Als Items weist Du der Liste Objekte vom Typ KeyValuePair(Of Integer, String) zu.
     
    Wenn Du Dir SelectedItem geben lässt, dann bekommst Du ein Objekt vom Typ KeyValuePair(Of Integer, String), dessen ToString-Methode “[key, value]” liefert.
     
    Wenn Du Dir SelectedValue geben lässt, dann bekommst Du für das ausgewählte Listenelement den Eigenschaftswert der Eigenschaft, die im SelectedValuePath angegeben ist.
     
    Ich verstehe nicht, wo Dein Problem ist.
     
    Hier mal eine Demo:
     
    XAML
     
    <Window x:Class="Window15"
        Title="Window15" Height="300" Width="300"
        xmlns:app="clr-namespace:WpfApplication1">
      <Window.Resources>
        <app:Window15Data x:Key="data"/>
      </Window.Resources>
      <StackPanel DataContext="{Binding Source={StaticResource data}}">
        <Label Content="{Binding SQLServerName}" Height="30" />
        <ComboBox ItemsSource="{Binding Dic}" DisplayMemberPath="Value"
                   SelectedValuePath="Value" SelectedValue="{Binding SQLServerName, Mode=TwoWay}" />
      </StackPanel>
    </Window>
     
    Dazu der Code:
     
    Imports System.ComponentModel
     
    Public Class Window15Data
      Implements INotifyPropertyChanged
     
      Public Sub New()
        Dic.Add(1, "Hallo")
        Dic.Add(2, "Test")
        Dic.Add(3, "Server")
      End Sub
     
      Public Property Dic As New Dictionary(Of Integer, String)
     
      Private _sQLServerName As Object
      Public Property SQLServerName As Object
        Get
          Return Me._sQLServerName
        End Get
        Set(ByVal value As Object)
          Me._sQLServerName = value
          RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("SQLServerName"))
        End Set
      End Property
     
      Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
     
    End Class
     
    --
    Viele Grüße
    Peter
    Sonntag, 3. Juli 2011 14:29

Alle Antworten

  • Hallo Torsten,

    das sollte eigentlich so funktionieren.

    Poste dochmal das komplette Xaml deiner Combobox.



    Freitag, 1. Juli 2011 06:37
    Beantworter
  • Hallo Marco,

     

    hier das komplette XAML

     

    <Page x:Class="Login.SCBIZ_Anlage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="SCBIZ_Anlage" 
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
      
        
      <Grid Name="GridSystemUser" Grid.Column="0" Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment ="Stretch" Background="{x:Null}" >
      
        <Grid.ColumnDefinitions >
            <ColumnDefinition Width="15"/>
            <ColumnDefinition Width="120"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="56"/>
            <ColumnDefinition Width="15" />
          </Grid.ColumnDefinitions>
    
        <Grid.RowDefinitions >
          <RowDefinition Height="5" />
          <RowDefinition Height="26" />
          <RowDefinition Height="40" />
          <RowDefinition Height="26" />
          <RowDefinition Height="70" />
          <RowDefinition Height="26" />
          <RowDefinition Height="30" />
          <RowDefinition Height="30" />
          <RowDefinition Height="30" />
          <RowDefinition Height="30" />
          <RowDefinition Height="35*" />
          <RowDefinition Height="40*" />
          <RowDefinition Height="*" />
          </Grid.RowDefinitions>
    
        <!-- Background-->
        <Border Grid.ColumnSpan="5" Grid.RowSpan="12" Margin="0,0,0,0" Style="{DynamicResource BorderNoCornerSimple}" />
    
        <!-- Überschrift-->
        <Border Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="1" Background="#54ADD8E6" Margin="1" CornerRadius="3,3,3,3" BorderThickness="1" BorderBrush="DarkGray" >
          <Label Content="Registrierung der wawi2rewe Datenbank" FontWeight="Bold" />
        </Border>
        
        <TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="2" Foreground="#FFB44C4C" FontSize="9" FontStretch="Condensed" TextWrapping="WrapWithOverflow" Margin="5,2,5,2">
          Diese Seite wird angezeigt, da der Mandant, an dem Sie sich versucht haben anzumelden nicht für die wawi2rewe Nutzung konfiguriert ist. Bitte suchen Sie hier nach
          der wawi2rewe Datenbank und geben dann die Systembenutzerdaten ein. Wenn Sie nicht wissen wie das geht, kontaktieren Sie Ihren Systemadministrator.
        </TextBlock>
    
        <!-- Sage Informationen-->
        <Border Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" Background="#54ADD8E6" Margin="1" CornerRadius="3,3,3,3" BorderThickness="1" BorderBrush="DarkGray" >
          <Label Content="Aktuelle Sage Informationen" FontWeight="Bold" />
        </Border>
          
        <Grid Name="GridSageInfos" Grid.Column="1" Grid.Row="4" Margin="5,1,5,1" >
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions >
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
          </Grid.RowDefinitions>
    
          <Label Grid.Column="0" Grid.Row="0" Content="SQL Server:" FontWeight="Bold" />
          <Label Grid.Column="0" Grid.Row="1" Content="Datenbank:" FontWeight="Bold"/>
          <Label Grid.Column="0" Grid.Row="2" Content="Mandant:" FontWeight="Bold"/>
          
        </Grid>
    
        <Grid Name="GridSageInfosLabels" Grid.Column="2" Grid.Row="4" Margin="15,1,5,1" >
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions >
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
          </Grid.RowDefinitions>
    
          <Label Grid.Column="1" Grid.Row="0" Name="OLServer" Content="{Binding SageServer, Mode=TwoWay}" HorizontalAlignment="Left" Height="20"/>
          <Label Grid.Column="1" Grid.Row="1" Name="OLDatenbank" Content="{Binding SageDBName, Mode=TwoWay}" HorizontalAlignment="Left" Height="20"/>
          <Label Grid.Column="1" Grid.Row="2" Name="OLMandant" Content="{Binding SageMandant, Mode=TwoWay}" HorizontalAlignment="Left" Height="20"/>
    
        </Grid>
    
        <Border Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="5" Background="#54ADD8E6" Margin="1" CornerRadius="3,3,3,3" BorderThickness="1" BorderBrush="DarkGray" >
          <Label Content="Systeminformationen " FontWeight="Bold" />
        </Border>
    
        <Label Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="6" Content="Server:" FontWeight="Bold" Margin="5,1,5,1" />
        <ComboBox Grid.Column="2" Grid.Row="6" Margin="15,0,0,0" Height="25" HorizontalAlignment="Left" VerticalAlignment="Center" Name="CmbServerName" Width="280" Text="" Background="Ivory" BorderBrush="#FF9C9595" SelectedItem="{Binding SQLServerName, Mode=TwoWay}" TabIndex="1" />
    
        <Label Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="7" Content="Instanz:" FontWeight="Bold" Margin="5,1,5,1" />
        <ComboBox Grid.Column="2" Grid.Row="7" Margin="15,0,0,0" Height="25" HorizontalAlignment="Left" VerticalAlignment="Center" Name="CmbInstanceName" Width="280" Text="" Background="Ivory" BorderBrush="#FF9C9595" SelectedItem="{Binding SQLInstanceName, Mode=TwoWay}" TabIndex="1" />
    
        <Label Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="8" Content="System Username:" FontWeight="Bold" Margin="5,1,5,1" />
        <TextBox Grid.Column="2" Grid.Row="8" Height="25" Margin="15,0,0,0" HorizontalAlignment="Left" Name="txtUserName" VerticalAlignment="Center" Width="280" Text="{Binding SQLUser, Mode=TwoWay, UpdateSourceTrigger= LostFocus}" TabIndex="3" />
    
        
        <Label Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="9" Content="System Password:" FontWeight="Bold" Margin="5,1,5,1" />
        <PasswordBox Grid.Column="2" Grid.Row="9" Height="25" Margin="15,0,0,0" HorizontalAlignment="Left" Name="txtPassword" VerticalAlignment="Center" Width="280" OpacityMask="{x:Null}" TabIndex="4" />
    
        <!-- Zeile 8 Status -->
        <TextBlock Grid.Column="1" Grid.Row="10" Grid.ColumnSpan="3" Visibility="Visible" TextWrapping="WrapWithOverflow" Name="StatusMeldung" Margin="15,1,5,1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Foreground="DarkRed" FontWeight="Bold" FontSize="10" Text="{Binding LabelStatus, Mode=TwoWay}" />
        
        
      </Grid> 
        
    </Page>
    

    ich denke das Problem liegt beim zuweisen des Propertys... Das Property ist ein String, aber er weisst hier mit den Key des Dictionarys zu, obwohl er nur den reinen Value nehmen sollte...

     

    Torsten

    Freitag, 1. Juli 2011 19:31
  • Mit dem Items.Add wird bei Dir der Inhalt des Wörterbuches in Strings umgewandelt. Das spätere Zuweisen der DisplayMemberPath-Eigenschaft bleibt danach ohne Wirkung.
     
    Bei mir funktioniert das folgendermaßen in einer kleinen Demo:
     
    XAML:
     
    <Window x:Class="Window15"
        Title="Window15" Height="300" Width="300"
        xmlns:app="clr-namespace:WpfApplication1">
      <Window.Resources>
        <app:Window15Data x:Key="data"/>
      </Window.Resources>
      <StackPanel DataContext="{Binding Source={StaticResource data}}">
         <ComboBox ItemsSource="{Binding Dic}" DisplayMemberPath="Value" />  
        </StackPanel>
    </Window>
     
    Code dazu:
     
    Public Class Window15Data
     
      Public Sub New()
        Dic.Add(1, "Hallo")
        Dic.Add(2, "Test")
        Dic.Add(3, "Server")
      End Sub
     
      Public Property Dic As New Dictionary(Of Integer, String)
     
    End Class
     
    --
    Viele Grüße
    Peter
    Samstag, 2. Juli 2011 06:19
  • Hallo Peter,

     

    danke für Deine Antwort. Genau das habe ich ja getan. Halt nur im Code.

    Siehe hier:

    Dim dic As New Dictionary(Of Integer, String)
    dic = SOL.SQLDataConnection.GetDicOfServerNames
    
    Me.CmbServerName.ItemsSource = dic
    Me.CmbServerName.DisplayMemberPath = "Value"
    Me.CmbServerName.SelectedValuePath = "Value"
    

    Mein Problem ist nun, dass ich das Selected Item als Property gebunden habe. Hier kommt aber ein Key Value Pair an (Value Item der Dictionary). --> Sprich String = "1,Hallo" --> Brauche aber nur Hallo

    Ich brauche aber nur das Value ohne den Key im Selected Item.

    Torsten

    Samstag, 2. Juli 2011 09:02
  • Hast Du meinen Beitrag gelesen?
     
    Hier nochmals:
     
    Mit dem Items.Add wird bei Dir der Inhalt des Wörterbuches in Strings umgewandelt. Das spätere Zuweisen der DisplayMemberPath-Eigenschaft bleibt danach ohne Wirkung.
     
    --
    Viele Grüße
    Peter
    Samstag, 2. Juli 2011 11:38
  • Ja, habe ich... Dies ist aber nicht meine Frage und mein Problem.

    Momentan habe ich es über die Zuweisung mit Items.Add gelöst... Dazu muss ich aber mehr Code produzieren, da ich ja mit einer For Schleife das Dictionary durchlaufen muss. Macht keinen Sinn...

    In meinem oben beschriebenen Fall weise ich direkt das Dic über ItemsSource zu und möchte dann über SelectedValue das Value nutzen. Dieses kommt aber als KeyValue Pair an, obwohl ich nur den Value zugewiesen habe.....

     

    Hierzu brauche ich eine Lösung.

     

    Danke und Gruss

    Torsten

    Sonntag, 3. Juli 2011 13:24
  • Als Items weist Du der Liste Objekte vom Typ KeyValuePair(Of Integer, String) zu.
     
    Wenn Du Dir SelectedItem geben lässt, dann bekommst Du ein Objekt vom Typ KeyValuePair(Of Integer, String), dessen ToString-Methode “[key, value]” liefert.
     
    Wenn Du Dir SelectedValue geben lässt, dann bekommst Du für das ausgewählte Listenelement den Eigenschaftswert der Eigenschaft, die im SelectedValuePath angegeben ist.
     
    Ich verstehe nicht, wo Dein Problem ist.
     
    Hier mal eine Demo:
     
    XAML
     
    <Window x:Class="Window15"
        Title="Window15" Height="300" Width="300"
        xmlns:app="clr-namespace:WpfApplication1">
      <Window.Resources>
        <app:Window15Data x:Key="data"/>
      </Window.Resources>
      <StackPanel DataContext="{Binding Source={StaticResource data}}">
        <Label Content="{Binding SQLServerName}" Height="30" />
        <ComboBox ItemsSource="{Binding Dic}" DisplayMemberPath="Value"
                   SelectedValuePath="Value" SelectedValue="{Binding SQLServerName, Mode=TwoWay}" />
      </StackPanel>
    </Window>
     
    Dazu der Code:
     
    Imports System.ComponentModel
     
    Public Class Window15Data
      Implements INotifyPropertyChanged
     
      Public Sub New()
        Dic.Add(1, "Hallo")
        Dic.Add(2, "Test")
        Dic.Add(3, "Server")
      End Sub
     
      Public Property Dic As New Dictionary(Of Integer, String)
     
      Private _sQLServerName As Object
      Public Property SQLServerName As Object
        Get
          Return Me._sQLServerName
        End Get
        Set(ByVal value As Object)
          Me._sQLServerName = value
          RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("SQLServerName"))
        End Set
      End Property
     
      Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
     
    End Class
     
    --
    Viele Grüße
    Peter
    Sonntag, 3. Juli 2011 14:29