2010-11-16 17 views
0

i ont un combobox:prendre combobox valeur sélectionnée comme une clé pour datatemplate d'un autre contrôle WPF

<Grid> 

    <ComboBox Height="52" HorizontalAlignment="Left" 
       ItemsSource="{Binding templatesNames}" 
       SelectedValuePath="Type.FullName"   
       Margin="169,43,0,0" Name="comboBox1" 
       VerticalAlignment="Top" Width="148" /> 

    <Button Content="Button" 
    ***Template="{Binding key = Converter={Binding SelectedItem.Value,ElementName=comboBox1}}" 
      Height="56" HorizontalAlignment="Left" 
      Margin="191,204,0,0" Name="button1" 
      VerticalAlignment="Top" Width="80" /> 
</Grid> 

le problème est signé avec * Je templatesNames comment tient les noms de modèles Je veux covert ces noms dans la clé à laquelle le bouton est sur le point de se lier (touches de modèle)

comment puis-je le faire? ... que devrait faire le convertisseur? est-ce nécessaire? je ne peux pas l'utiliser?

EDIT: ce que je fais maintenant:

<ComboBox x:Name="ComboBox1" 
           ItemsSource="{Binding collection}" 
           Margin="553,0,0,13" 
           SelectedValuePath="Type.FullName" SelectedIndex="1" 
           FontFamily="Buxton Sketch" 
           FontSize="20" HorizontalAlignment="Left" Width="231" Height="46"  VerticalAlignment="Bottom" /> 

où la collecte est la collecte de ObservableCollection publique {get; ensemble; }

le bouton est similer à @Meleak Button et l'espace de noms de projet est clr-namespace: dinamicGridLayout devrais-je écrire à l'intérieur du convertisseur Uri resourceLocater = new Uri (@ "clr-namespace: dinamicGridLayout; ResourceDictionary1.xaml", système .UriKind.Relative) ;?

Répondre

1

Si vous mettez tous vos ControlTemplates dans une ressource de dictionnaire vous pouvez utiliser un convertisseur pour le modèle comme celui-ci

<ComboBox Height="52" HorizontalAlignment="Left" 
      ItemsSource="{Binding templatesNames}" 
      SelectedValuePath="Type.FullName"   
      Margin="169,43,0,0" Name="comboBox1" 
      VerticalAlignment="Top" Width="148" /> 

<Button Content="Button" 
     Template="{Binding SelectedItem.Value, 
          ElementName=comboBox1, 
          Converter={StaticResource TemplateConverter}}" 
     Height="56" HorizontalAlignment="Left" 
     Margin="191,204,0,0" Name="button1" 
     VerticalAlignment="Top" Width="80" /> 

Et dans le convertisseur vous chargez le ControlTemplate de la ressource de dictionnaire et de le retourner.

public class TemplateConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string resourceKey = value.ToString(); 
     Uri resourceLocater = new Uri("/YourNamespace;component/Dictionary1.xaml", System.UriKind.Relative); 
     ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater); 
     return resourceDictionary[resourceKey] as ControlTemplate; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

Mise à jour

Si votre espace de noms est dinamicGridLayout le convertisseur devrait ressembler à ceci

Uri resourceLocater = new Uri("/dinamicGridLayout;component/Dictionary1.xaml", System.UriKind.Relative); 

projet Petit exemple uploadés here.

+0

il semble juste mais deux q: 1.StaticResource ?? Es-tu crétin à ce sujet? 2./VotreNamespace;component/Dictionary1.xaml "supposons que mon espace de nom est xxxx devrait-il être" clr-namespace: xxx; Dictionary1.xaml "? –

+0

s'il vous plaît voir mon EDIT, merci ... –

+0

vous êtes le meilleur :) –