XAML binding on click

Continuing from my last question, I'd like to know how can I bind when a button is clicked (can this be done through pure XAML?) - or more simply, how can I do XAML-like binding through C# code?

EDIT: The previous question containing info:

I want to create a listbox that'll be bound to XPath, relative to the other listbox's currently selected item.

It's using XmlDataProvider for the data, and the XML file looks like this:


    
        
        
    
    

    ...


So, the "parent" listbox is listing out all the programs, while "child" shows only Steps from the current Program. I just need a pointer on the fact what's such type of binding called.

Thanks in advance.

End of previous question

The question is how can I do a one time bind (I do not want binding to change as soon as user clicks another listbox item) when a button called "Load" is pressed?

1
задан Community 23 May 2017 в 12:11
поделиться

2 ответа

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

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

Изменить

Для того, чтобы вышеизложенное работало, вы должны изменить Шаг ListBox на :

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

Этот ListBox не будет ничего отображать, пока его DataContext не будет назначен.

1
ответ дан 2 September 2019 в 21:44
поделиться

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

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

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

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

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

1
ответ дан 2 September 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: