【问题标题】:XAML binding on click单击时的 XAML 绑定
【发布时间】:2011-04-05 09:44:09
【问题描述】:

继续我的last question,我想知道如何在单击按钮时进行绑定(这可以通过纯 XAML 完成吗?) - 或者更简单地说,我如何通过 C# 进行类似 XAML 的绑定代码?

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

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

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

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

    ...

</Programs>

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

提前致谢。

上一个问题结束

问题是如何进行一次性绑定(我不希望一旦用户点击另一个列表框就改变绑定item) 当一个名为“Load”的按钮被按下时?

【问题讨论】:

  • 绑定什么到什么?请详细说明...
  • errr,您只想在绑定后创建代码吗?如果是这样,那么您可以在 onlclick 事件中使用 BindingOperations.SetBinding 方法。

标签: c# wpf xaml binding


【解决方案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>

为了让细节只有在用户单击按钮时才会发生变化,必须进行哪些更改?一件事:ListBox 上的 DataContext 名为 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}"/>

除非分配了DataContext,否则ListBox 不会显示任何内容。

【讨论】:

  • 很抱歉,如果我的下一个问题没有意义,但不是每次更改程序列表框选择时,这段 XAML 代码都会更改我的步骤列表框吗?
  • 我应该更清楚。在 XAML 中,删除步骤列表框的 DataContext 上的绑定。然后DataContext 在单击按钮之前不会更改。
  • 我已经移除了 DataContext 绑定,并做了代码隐藏,现在什么也没发生,简单地绑定是行不通的。另一个问题:在我将 DataContext 分配给列表框之后,它不会在每次程序列表框更改时都保持不变吗?我想我需要显式绑定,但我仍在努力让它工作,你能给我一些建议吗?
  • 我在发布之前确实测试了该代码,因此如果不查看您的代码,我无法告诉您为什么它不起作用。至于你的第二个问题,没有。您将Step.DataContext 分配给XML 文档的一个节点。除了在分配时,Program 列表框不会以任何方式参与。
  • 好吧,我想我明白你的意思了,但你没有明白我的意思。确实不涉及程序列表框。但步骤列表框是!只要我绑定数据上下文(通过代码?)会发生什么,我的步骤列表框会在我下次更改程序列表框中的选定项目时发生变化,这就是我想要避免的行为。除非按下加载按钮(并且满足其他一些条件),否则我的应用程序不应更改程序。我希望你明白我的意思。
【解决方案2】:

将 Command 属性绑定到实现 ICommand 的属性。

假设您有一个对象(ViewModel),其属性“ICommand HelloCommand { get { ... }; }”设置为数据上下文:

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

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

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

【讨论】:

  • 呃,你这是什么意思?我所需要的只是基于 C# 的想法,如何通过代码分配绑定。
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多