Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击时的XAML绑定_C#_Wpf_Xaml_Binding - Fatal编程技术网

C# 单击时的XAML绑定

C# 单击时的XAML绑定,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,从我的开始,我想知道当点击按钮时如何绑定(这可以通过纯XAML实现吗?),或者更简单地说,如何通过C#代码实现类似XAML的绑定 编辑:包含信息的上一个问题: 我想创建一个绑定到XPath的列表框,相对于另一个列表框的当前选定项 它对数据使用XmlDataProvider,XML文件如下所示: <Programs> <Program name="..."> <Step name="..."/> <Step name

从我的开始,我想知道当点击按钮时如何绑定(这可以通过纯XAML实现吗?),或者更简单地说,如何通过C#代码实现类似XAML的绑定

编辑:包含信息的上一个问题:

我想创建一个绑定到XPath的列表框,相对于另一个列表框的当前选定项

它对数据使用XmlDataProvider,XML文件如下所示:

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

    ...

</Programs>

...
因此,“父”列表框列出了所有程序,而“子”仅显示当前程序的步骤。 我只需要一个指针,指示这种类型的绑定叫什么

提前谢谢

上一个问题结束


问题是当按下名为“加载”的按钮时,如何执行一次性绑定(我不希望用户单击另一个列表框项目时绑定即发生更改)?

将命令属性绑定到实现ICommand的属性

假设将属性“ICommand HelloCommand{get{…};}”设置为数据上下文的对象(ViewModel):

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

单击按钮时,将调用ICommand实现的Execute方法。CanExecute方法应返回命令是否可用,并将确定按钮的启用状态


还有一些帮助器类和框架可以简化(和/或更复杂)。

让我们从一个示例开始,在该示例中,每当用户选择主列表框中的项目时,详细列表框都会发生更改:

<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>
编辑

为了使上述功能正常工作,您必须将
步骤
列表框
更改为:

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


除非分配了它的
DataContext
,否则该
列表框将不会显示任何内容。

将什么绑定到什么?请详细说明…呃,您是否只想在绑定后创建代码?如果是这样,那么您可以在onlclick事件中使用BindingOperations.SetBinding方法。呃,这是什么意思?我所需要的只是基于C#的想法如何通过代码分配绑定。如果我的下一个问题毫无意义,那么很抱歉,但是每次更改程序列表框选择时,这段XAML代码不是都会更改我的步骤列表框吗?我应该更清楚一些。在XAML中,删除步骤列表框的
DataContext
上的绑定。然后,在单击按钮之前,
DataContext
不会被更改。我已经删除了DataContext绑定,并将代码隐藏起来,只是现在什么都没有发生,简单地绑定是不起作用的。另一个问题:在我将DataContext分配给listbox之后,它不会在每次程序listbox更改时都保持并更改吗?我想我需要显式绑定,但我仍在努力让它工作,你能给我一些提示吗?我在发布代码之前测试了代码,所以不看你的代码我就无法告诉你为什么它不工作。至于第二个问题,没有。您正在将
Step.DataContext
分配给XML文档的一个节点。除了作业的那一刻,
程序
列表框没有涉及任何内容。好吧,我想我明白你的意思了,但你没有理解我。程序列表框实际上不涉及。但步骤列表框是!一旦我绑定了数据上下文(通过代码?),我的步骤列表框就会在我下一次更改程序列表框中的选定项时发生更改,这就是我想要避免的行为。我的应用程序不应该更改程序,除非按下加载按钮(并且满足一些其他条件)。我希望你明白我的意思。
<ListBox x:Name="Step" DockPanel.Dock="Top" ItemsSource="{Binding XPath=Step/@name}"/>