继续我的last question,我想知道如何在点击按钮时绑定(这可以通过纯XAML完成吗?) - 或者更简单地说,我该如何进行类似XAML的绑定通过C#代码?
编辑:上一个包含信息的问题:
我想创建一个列表框,该列表框将绑定到XPath,相对于其他列表框的当前所选项目。
它使用XmlDataProvider作为数据,XML文件如下所示:
<Programs>
<Program name="...">
<Step name="..."/>
<Step name="..."/>
</Program>
<Program name="another">
...
</Programs>
因此,“父”列表框列出了所有程序,而“子”仅显示当前程序的步骤。 我只需要一个关于这种类型的绑定的事实的指针。
提前致谢。
上一个问题的结尾
问题是 如何进行一次性绑定(我不希望绑定在用户点击另一个列表框后立即更改item)当按下一个名为“Load”的按钮时?
答案 0 :(得分:1)
将Command属性绑定到实现ICommand的属性。
假设您有一个对象(ViewModel),其属性“ICommand HelloCommand {get {...};}”被设置为数据上下文:
<Button Content="Hello" Command="{Binding HelloCommand}"/>
单击按钮时将调用ICommand实现的Execute方法。 CanExecute方法应返回命令是否可用并确定按钮的启用状态。
还有一些辅助类和框架可以使这更简单(和/或更复杂)。
答案 1 :(得分:1)
让我们从一个示例开始,只要用户选择主列表框中的项目, 的详细信息列表框就会改变:
<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
的{{1}}上的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
,否则不会显示任何内容。