2

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 が生成されたら、次のボタン IsEnabled プロパティをすべての ListBoxItem で true に変更する必要があります。<Button Name="btnRefresh" IsEnabled="false"/>

問題:

ListBoxItem にアクセスできないため、そのボタンを使用して子にアクセスできません。

WPF には、Silverlight にある ListBox.Descendents() のようなもの、またはそのボタンに到達する他の方法がありますか?

4

2 に答える 2

7

これを行うための推奨される方法は、ViewModelそのButtonのIsEnabledプロパティにバインドされているのプロパティを変更することです。イベントにハンドラーを追加しListBox.Loaded、ListBoxがロードされたときにViewModelのそのプロパティをfalseに設定します。

もう1つのオプションは、リストボックス内の各データテンプレートアイテムをトラバースする必要がある場合、次の手順を実行します。

    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 に答える