2

在 WPF 应用程序中,我使用在 XAML 中的以下 DataTemplate 中定义的 ItemTemplate 创建列表框:

<DataTemplate x:Key="ListItemTemplate">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <StackPanel>
      <Button/>
      <Button/>
      <Button Name="btnRefresh" IsEnabled="false"/>
      <TextBlock/>
      <TextBlock/>
      <TextBlock/>
      <TextBlock/>
    </StackPanel>
    <TextBox/>
  </Grid>
</DataTemplate>

生成 ListBox 后,我需要在所有 ListBoxItem(s) 上将以下按钮 IsEnabled 属性更改为 true:<Button Name="btnRefresh" IsEnabled="false"/>

问题:

我无法访问 ListBoxItem(s),因此无法使用其中的那个按钮访问他们的孩子。

WPF 中是否有像 Silverlight 中的 ListBox.Descendents() 之类的东西,或者以任何其他方式访问该按钮,

4

2 回答 2

7

执行此操作的首选方法是更改ViewModel​​绑定到该按钮的 IsEnabled 属性的属性。向事件添加一个处理程序,ListBox.Loaded并在加载 ListBox 时将 ViewModel 中的该属性设置为 false。

另一个选项,如果您需要遍历 ListBox 中的每个数据模板项,请执行以下操作:

    if (listBox.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
        {
           foreach (var item in listBox.Items)
           {
              ListBoxItem container = listBox.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
              // Get button
              ContentPresenter contentPresenter = contentPresenter.ContentTemplate.FindName("btnRefresh", contentPresenter);
              Button btn = contentPresenter as Button;
              if (btn != null)
                  btn.IsEnabled = true;
           }
        }
于 2012-06-12T22:46:51.327 回答
3

如果您只需要启用 ListBoxItem 中的按钮,则可以使用 XAML 解决方案。使用 DataTemplate.Triggers:

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding RelativeSource=
        {RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
        <Setter TargetName="btnRefresh" Property="IsEnabled" Value="true"/>
    </DataTrigger>
</DataTemplate.Triggers>

这样,无论何时选择 ListBoxItem,都会启用该项目上的按钮。不需要 c# 代码。简单干净。

可以在以下位置找到更多详细信息:http ://wpftutorial.net/DataTemplates.html

于 2013-04-22T20:50:56.577 回答