XAML привязка по клику - PullRequest
       28

XAML привязка по клику

1 голос
/ 29 августа 2010

В продолжение моего последнего вопроса , я хотел бы знать, как я могу связать при нажатии кнопки (это можно сделать с помощью чистого XAML?) - или, проще, как я могу сделать XAML-привязывание через код C #?

РЕДАКТИРОВАТЬ: предыдущий вопрос, содержащий информацию:

Я хочу создать список, который будет привязан к XPath, относительнодругой элемент списка, выбранный в настоящий момент.

Он использует XmlDataProvider для данных, и файл XML выглядит следующим образом:

<Programs>
    <Program name="...">
        <Step name="..."/>
        <Step name="..."/>
    </Program>
    <Program name="another">

    ...

</Programs>

Итак, список «родитель» перечисляет все программы,в то время как «ребенок» показывает только шаги из текущей программы.Мне просто нужен указатель на тот факт, что называется такой тип привязки.

Заранее спасибо.

Конец предыдущего вопроса

Вопрос как мне выполнить одноразовое связывание (я не хочу, чтобы привязка изменилась, как только пользователь щелкнет по другому элементу списка), когда кнопка называется «Загрузить»нажата?

Ответы [ 2 ]

1 голос
/ 29 августа 2010

Давайте начнем с примера, в котором поле подробного списка меняет , когда пользователь выбирает элемент в поле основного списка:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="Programs">
      <x:XData>
        <Programs xmlns="">
          <Program name="Some program">
            <Step name="Some program step 1"/>
            <Step name="Some program step 2"/>
            <Step name="Some program step 3"/>
            <Step name="Some program step 4"/>
          </Program>
          <Program name="Some other program">
            <Step name="Some other program step 1"/>
            <Step name="Some other program step 2"/>
            <Step name="Some other program step 3"/>
            <Step name="Some other program step 4"/>
          </Program>        
        </Programs>
      </x:XData>
    </XmlDataProvider>
  </Page.Resources>
  <DockPanel>  
    <Label DockPanel.Dock="Top">Programs</Label>
    <ListBox x:Name="Program" DockPanel.Dock="Top" ItemsSource="{Binding Source={StaticResource Programs}, XPath=/Programs/Program}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding XPath=@name}"/>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    <Label DockPanel.Dock="Top">Steps</Label>
    <ListBox x:Name="Step" DockPanel.Dock="Top" DataContext="{Binding ElementName=Program, Path=SelectedItem}" ItemsSource="{Binding XPath=Step/@name}"/>
  </DockPanel>
</Page>

Что нужно изменить, чтобы детали изменялись только тогда, когда пользователь нажимает кнопку? Одна вещь: DataContext на ListBox с именем Step. Для этого вам нужно использовать программный код, но код довольно прост:

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (Program.SelectedItem != null)
    {
        Step.DataContext = Program.SelectedItem;
    }
}

Редактировать

Чтобы вышеперечисленное сработало, вы должны изменить Step ListBox на:

<ListBox x:Name="Step" DockPanel.Dock="Top" ItemsSource="{Binding XPath=Step/@name}"/>

То, что ListBox ничего не отобразит, если не назначено DataContext.

1 голос
/ 29 августа 2010

Свяжите свойство Command со свойством, реализующим ICommand.

Предполагается, что у вас есть объект (ViewModel) со свойством "ICommand HelloCommand {get {...};}", установленным в качестве контекста данных:

<Button Content="Hello" Command="{Binding HelloCommand}"/>

Метод Execute реализации ICommand будет вызываться при нажатии кнопки. Метод CanExecute должен возвращать информацию о доступности команды и определять включенный статус кнопки.

Существуют также вспомогательные классы и структуры, которые могут сделать это проще (и / или более сложным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...