在WPF应用程序中,我使用在XAML中的以下DataTemplate中定义的ItemTemplate创建Listbox:
<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上更改以下按钮IsEnabled propety为true:<Button Name="btnRefresh" IsEnabled="false"/>
问题:
我无法访问ListBoxItem,因此无法通过其中的按钮访问他们的孩子。
在WPF中是否存在像ListBox.Descendents()这样的Silverlight或任何其他方式来获取该按钮,
答案 0 :(得分:7)
执行此操作的首选方法是更改绑定到Button的IsEnabled属性的ViewModel
中的属性。向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;
}
}
答案 1 :(得分: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