принять выбранное значение в выпадающем списке в качестве ключа для dataTemplate другого элемента управления wpf - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть выпадающий список:

   <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>

проблема подписана с * У меня есть templatesNames, как держит имена шаблонов Я хочу преобразовать эти имена в ключ, к которому будет привязана кнопка (ключи шаблона)

как я могу это сделать? ... что должен делать конвертер? это нужно? я не могу использовать это?

EDIT: вот что я делаю сейчас:

    <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" />

где коллекция является общедоступной коллекцией ObservableCollection {get; задавать; }

кнопка аналогична @Meleak Button, а пространство имен проекта - clr-namespace: dinamicGridLayout Должен ли я написать в конвертере Uri

1 Ответ

1 голос
/ 17 ноября 2010

Если вы поместите все ваши ControlTemplates в словарь ресурсов, вы можете использовать конвертер для шаблона, как это

<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" />

И в Converter вы загружаете ControlTemplate из словаря ресурсов и возвращаете его.

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;
    }
}

Обновление

Если ваше пространство имен - dinamicGridLayout, то конвертер должен выглядеть следующим образом

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

Загружен небольшой пример проекта здесь .

...