2017-10-19 25 views
0

J'ai 2 ComboBox, 1 zone de texte et 1 bouton, le bouton a la liaison multiple pour passer la valeur des combox et la zone de texte, mais 1 de la liste déroulante est remplie avec un Objec que j'ai créé et j'ai DataTemplate pour afficher uniquement 1 des propriétés de l'objet que j'ai créé. Quand j'obtiens dans le ViewModel les valeurs Fonctionne bien pour la combox qui est remplie avec des chaînes et avec le texBox, mais quand j'inspecte la valeur de l'autre combox me renvoie une chaîne avec le nom de l'objet que j'ai créé.Multibinding avec combobox

Que dois-je faire pour obtenir la propriété (Id) de l'objet, et non le nom?

Le XAML

<ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="183,59,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding _combo}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="Situación: "></TextBlock> 
        <TextBlock Text="{Binding Path=Nombre}" Width="80"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 

    </ComboBox> 

    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="573,66,0,0" VerticalAlignment="Top" Width="75" > 
     <Button.CommandParameter> 
      <MultiBinding Converter="{StaticResource ResourceKey=multiDateConverter}"> 
       <Binding ElementName="textBox" Path="Text"></Binding> 
       <Binding ElementName="comboBox" Path="Text"></Binding> 
       <Binding ElementName="comboBox1" Path="Text"></Binding> 
      </MultiBinding> 
     </Button.CommandParameter> 
     <Button.Command> 
      <Binding Path="GetAllActionLogsBetweenDatesCommand"></Binding> 
     </Button.Command> 
    </Button> 

Ceci est le code objet

namespace PedidosRetraso.Model 
{ 
    class PocoCombo 
    { 
     public int Id { get; set; } 
     public string Nombre { get; set; } 
    } 
    class Prueba: PocoCombo 
    { 

    } 
} 

Le code ViewModel:

class ViewModelMain 
    { 
     public ICommand GetAllActionLogsBetweenDatesCommand { get; set; } 

     public ObservableCollection<PocoCombo> _combo { get; set; } 


     public ViewModelMain() 
     { 
      GetAllActionLogsBetweenDatesCommand = new RelayCommand(GetAllActionLogsBetweenDates_Execute); 

      _combo = new ObservableCollection<PocoCombo> { new PocoCombo { Id = 20, Nombre = "Enviado" }, new PocoCombo { Id = 25, Nombre = "DIF" }, new PocoCombo { Id = 30, Nombre = "Confirmado" }, new PocoCombo { Id = 40, Nombre = "RP" }, new PocoCombo { Id = 50, Nombre = "Cerrado" }, new PocoCombo { Id = 60, Nombre = "C" } }; 
     } 

    private void GetAllActionLogsBetweenDates_Execute(object parameter) 
    { 
     try 
     { 
      var stringList = parameter as string[]; 

      string proveedor = stringList[0]; 
      string empresa = stringList[1]; 
      string situacion = stringList[2]; 
      DateTime fecha = DateTime.Parse(stringList[3]); 
      // Aqui la consulta SQL 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

Et enfin le convertisseur:

public class ICommandMultiDateConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     PocoCombo p = new PocoCombo(); 
     //p = (PocoCombo)values[2]; 
     return new string[] { values[0].ToString(), values[1].ToString(), values[2].ToString(),values[3].ToString() }; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Répondre

0

est ici la liaison:

<Binding ElementName="comboBox1" Path="SelectedItem.Id" /> 

L'élément sélectionné dans la zone de liste déroulante est une instance de PocoCombo. Vous voulez la propriété Id de cette instance - la voilà.

Aussi, ce serait une bonne idée de renommer _combo en Combo. Un nom minuscule préfixé avec un caractère de soulignement est universellement compris pour signifier qu'il s'agit d'un champ privé. Pour éviter toute confusion, une propriété publique doit être nommée dans "PascalCase": Combo dans ce cas. L'erreur ne va pas casser votre code, mais le corriger rendra votre code plus facile à comprendre.

+0

Oui, j'ai lu sur le privé est en minuscule et public avec majuscule, mais je ne sais pas pourquoi je pensais que c'était privé ,, aujourd'hui n'est pas mon jour .. Merci pour la réponse, fonctionne parfaitement . – Ion