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?
Давайте начнем с примера, где поле со списком сведений изменяется всякий раз, когда пользователь выбирает элемент в основном списке:
<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
не будет назначен.
Привяжите свойство Command к свойству, реализующему ICommand.
Предположим, что у вас есть объект (ViewModel) со свойством «ICommand HelloCommand { get { ... }; }», установленным в качестве контекста данных:
<Button Content="Hello" Command="{Binding HelloCommand}"/>
Метод Execute реализации ICommand будет вызываться при нажатии кнопки . Метод CanExecute должен вернуть информацию о том, доступна ли команда, и определить включенный статус кнопки.
Существуют также вспомогательные классы и фреймворки, которые могут сделать это проще (и/или сложнее).