2009-05-13 1 views
1

Я пытаюсь получить доступ к кнопке в .xaml-файле в коде, находящемся за файлом моего MainWindow.xaml. Я попытался использовать x: Class в файле, но когда я его использую, кнопка работает, но я получаю много других ошибок. поэтому я предпочитаю не использовать этот метод.Элементы управления доступом WPF в <ResourceDictionary>

Есть ли другие способы доступа к элементам управления в шаблоне с классом mainWindows.

код:

<ResourceDictionary xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
       xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
       xmlns:l="clr-namespace:Avalon.Demo" x:Class="Bildbanken.MainWindow"> 

     <!-- Taggarnas placering under bilderna (Left/ Top/ Right/ Bottom) --> 
         <Label Content="{Binding Type}" Padding="0,5,7,0" HorizontalAlignment="Right" /> 
         <Label Content="{Binding Category}" Padding="7,0,0,0" /> 
         <ListBox Name="ArtInfo" ItemsSource="{Binding Articles}" BorderThickness="0" Background="{TemplateBinding Background}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Grid> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="115px" /> 
              <ColumnDefinition Width="auto" /> 
             </Grid.ColumnDefinitions> 
             <TextBlock Grid.Column="0" Text="{Binding Artnr}"></TextBlock> 
             <Button HorizontalAlignment="Right" Name="testbutton" Grid.Column="1">--</Button> 
            </Grid> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
+0

Не могли бы вы указать, ПОЧЕМУ вы пытаетесь получить ссылку на кнопку в шаблоне? Я могу ошибаться, но в 99,9% это плохая практика, чтобы делать такие вещи в WPF. – arconaut

ответ

0

Доступ к содержимому таблицы данных можно получить. Вы можете получить корневой элемент шаблона, как это:

UIElement templateRoot = listbox.ItemTemplate.LoadContent() as UIElement; 

Оттуда вы используете VisualTreeHelper искать управления Button.

Если вы просто хотите обработать нажатие кнопки, использование альтернативных маршрутов WPF - лучшая альтернатива.

AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click)); 

Это будет захватывать каждую кнопку, независимо от источника. Если вы дадите кнопке тег или что-то еще, вы можете проверить это, чтобы отфильтровать только те кнопки, которые вы хотите.

0

Вы можете указать RoutedCommand, который вы можете добавить с помощью CommandBinding к вам DataTemplate и к кнопке. Таким образом, вы можете обрабатывать нажатие кнопки/команды, например, в коде позади и не нужно находить кнопку через VisualTreeHelper (или мой tipp будет SomeElement.TryFindResource («ButtonKey»)).

Очистить, что я имею в виду или я пропустил, понимая, что вы хотите сделать с вами, кнопка?

0

Сначала создайте файл .cs, где вы регистрируете свои команды. Это можно было бы назвать MyCommandCollection.cs. В этом классе можно определить и зарегистрировать RoutedCommand с:

public static readonly RoutedCommand ButtonPressCommand= new RoutedCommand("ButtonPress", typeof(MyCommandCollection)); 

Вы определяете команду в UserControl или окна вы хотите использовать его в пределах, например,

<UserControl.CommandBindings> 
    <CommandBinding Command="Commands:MyCommandCollection.ButtonPressCommand" Execute="Execute_ButtonPressCommand" ... /> 
</UserControl.CommandBindings> 

В отделенном коде вашего UserControl/Window вы реализуете/CanExecute методу Execute вашей команды.

Таким образом, вы можете использовать его также в ResourceDictionary, например, так:

<Button Command="Commands:MyCommandCollection.ButtonPressCommand" /> 

Не забудьте также поставить пространство имен ваших «MyCommandCollectionClass.cs» в UserControl/окна и ResourceDictionary, например:

xmlns:Commands="clr-namespace:MyApp.SomeFolder.Commands" 

Надеюсь, что это поможет.

0

Если вам требуется код для содержимого шаблона, обычно рекомендуется перемещать содержимое шаблона в пользовательский элемент управления. (И это часто хорошая идея, даже если вам не нужен код.)

Этот answer to another question иллюстрирует технику. (Вопрос может показаться нецелесообразным, но ответ оказался связанным с тем же подходом, который я защищаю здесь. В этом примере используются иерархические шаблоны, но они применимы и к обычным.)

Элементы управления пользователя предлагают два преимущества Вот. Во-первых, они помогают избежать чрезмерно сложных Xaml-файлов - для шаблонов легко доминировать над Xaml-файлом, если вы оставляете их тела inline, а не разделяете их на свои собственные файлы. Во-вторых, вы можете легко использовать codebehind.

Сказанное, я согласен с другими другими ответами здесь, в которых адвокат избегает кодового кода в первую очередь. (Я не совсем согласен с их конкретными решениями - я использую командный подход, но я не использую RoutedCommand. Я использую пользовательскую реализацию ICommand, которая следует за шаблоном, который обычно называется DelegatingCommand или RelayCommand.) Но даже тогда, Я все еще почти определяю шаблоны в качестве пользовательских элементов управления, просто для упрощения Xaml.

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

  • Нет связанных вопросов^_^