Metainformationen zur Seite
  •  

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
start:visualstudio2017:programmieren:dotnetgrundlagen:tipps_tricks [2022/09/23 06:34]
wikiadmin [Working with Checkboxes in the WPF TreeView / Arbeiten mit Kontrollkästchen in der WPF TreeView]
start:visualstudio2017:programmieren:dotnetgrundlagen:tipps_tricks [2022/09/23 07:04] (aktuell)
wikiadmin [Working with Checkboxes in the WPF TreeView / Arbeiten mit Kontrollkästchen in der WPF TreeView]
Zeile 488: Zeile 488:
 } }
 </code> </code>
 +Der interessanteste Aspekt dieser ViewModel-Klasse ist die Logik hinter der Eigenschaft IsChecked. Diese Logik erfüllt die Anforderungen 2 und 3, die zuvor gesehen wurden. Die IsChecked-Logik des FooViewModel ist unten dargestellt:
  
 <code C# [enable_line_numbers="true",highlight_lines_extra="0,"]> <code C# [enable_line_numbers="true",highlight_lines_extra="0,"]>
Zeile 536: Zeile 537:
 } }
 </code> </code>
 +
 +Diese Strategie ist spezifisch für die funktionalen Anforderungen, die ich mir selbst auferlegt habe. Wenn Sie andere Regeln haben, wie und wann Elemente ihren Prüfstatus aktualisieren sollten, passen Sie die Logik in diesen Methoden einfach an Ihre Bedürfnisse an.
 +
 +=== TreeView Konfiguration ===
 +Nun ist es an der Zeit zu sehen, wie die TreeView in der Lage ist, Kontrollkästchen anzuzeigen und an das ViewModel zu binden. Dies wird vollständig in XAML realisiert. Die TreeView-Deklaration ist eigentlich recht einfach, wie unten zu sehen ist:
 +
 +<code C# [enable_line_numbers="true",highlight_lines_extra="0,"]>
 +<TreeView 
 +  x:Name="tree"
 +  ItemContainerStyle="{StaticResource TreeViewItemStyle}"
 +  ItemsSource="{Binding Mode=OneTime}"
 +  ItemTemplate="{StaticResource CheckBoxItemTemplate}"
 +  />
 +</code
 +The TreeView’s ItemsSource property is implicitly bound to its DataContext, which inherits a List<FooViewModel> from the containing window. That list only contains one ViewModel object, but it is necessary to put it into a collection because ItemsSource is of type IEnumerable.
 + 
 +TreeViewItem is a container of visual elements generated by the ItemTemplate. In this demo, we assign the following HierarchicalDataTemplate to the tree's ItemTemplate property:
 + 
 +<code C# [enable_line_numbers="true",highlight_lines_extra="0,"]>
 +<HierarchicalDataTemplate 
 +  x:Key="CheckBoxItemTemplate"
 +  ItemsSource="{Binding Children, Mode=OneTime}"
 +  >
 +  <StackPanel Orientation="Horizontal">
 +    <!-- These elements are bound to a FooViewModel object. -->
 +    <CheckBox
 +      Focusable="False" 
 +      IsChecked="{Binding IsChecked}" 
 +      VerticalAlignment="Center"
 +      />
 +    <ContentPresenter 
 +      Content="{Binding Name, Mode=OneTime}" 
 +      Margin="2,0"
 +      />
 +  </StackPanel>
 +</HierarchicalDataTemplate>
 +</code>
 +
 In dieser Vorlage gibt es mehrere interessante Punkte. Die Vorlage enthält eine CheckBox, deren Eigenschaft Focusable auf false gesetzt ist. Dadurch wird verhindert, dass die CheckBox jemals den Eingabefokus erhält, was zur Erfüllung von Anforderung 4 beiträgt. Sie fragen sich vielleicht, wie wir die Anforderung 5 erfüllen können, wenn die CheckBox nie den Eingabefokus erhält. Wir werden dieses Problem später in diesem Artikel behandeln, wenn wir untersuchen, wie man das Verhalten eines ToggleButtons an ein TreeViewItem anhängen kann. In dieser Vorlage gibt es mehrere interessante Punkte. Die Vorlage enthält eine CheckBox, deren Eigenschaft Focusable auf false gesetzt ist. Dadurch wird verhindert, dass die CheckBox jemals den Eingabefokus erhält, was zur Erfüllung von Anforderung 4 beiträgt. Sie fragen sich vielleicht, wie wir die Anforderung 5 erfüllen können, wenn die CheckBox nie den Eingabefokus erhält. Wir werden dieses Problem später in diesem Artikel behandeln, wenn wir untersuchen, wie man das Verhalten eines ToggleButtons an ein TreeViewItem anhängen kann.
  
Zeile 624: Zeile 663:
 Die UpdateIsChecked-Methode setzt die angehängte IsChecked-Eigenschaft auf ein Element, das in dieser Demo ein TreeViewItem ist. Das Setzen einer angehängten Eigenschaft auf einem TreeViewItem hat selbst keinen Effekt. Damit die Anwendung diesen Eigenschaftswert verwenden kann, muss er an etwas gebunden sein. In dieser Anwendung ist sie an die IsChecked Eigenschaft eines FooViewModel Objekts gebunden. Der folgende Style wird der ItemContainerStyle Eigenschaft des TreeViews zugewiesen. Er bindet ein TreeViewItem an ein FooViewModel Objekt und fügt das virtuelle ToggleButton Verhalten hinzu, das wir gerade untersucht haben. Die UpdateIsChecked-Methode setzt die angehängte IsChecked-Eigenschaft auf ein Element, das in dieser Demo ein TreeViewItem ist. Das Setzen einer angehängten Eigenschaft auf einem TreeViewItem hat selbst keinen Effekt. Damit die Anwendung diesen Eigenschaftswert verwenden kann, muss er an etwas gebunden sein. In dieser Anwendung ist sie an die IsChecked Eigenschaft eines FooViewModel Objekts gebunden. Der folgende Style wird der ItemContainerStyle Eigenschaft des TreeViews zugewiesen. Er bindet ein TreeViewItem an ein FooViewModel Objekt und fügt das virtuelle ToggleButton Verhalten hinzu, das wir gerade untersucht haben.
  
-<code XAML [enable_line_numbers="true",highlight_lines_extra="0,"]>+<code XML [enable_line_numbers="true",highlight_lines_extra="0,"]>
 <Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem"> <Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem">
   <Setter Property="IsExpanded" Value="True" />   <Setter Property="IsExpanded" Value="True" />
Zeile 635: Zeile 674:
 Dieses Teil fügt das gesamte Puzzle zusammen. Beachten Sie, dass die angehängte Eigenschaft KeyboardNavigation.AcceptsReturn für jedes TreeViewItem auf true gesetzt ist, so dass der VirtualToggleButton seinen Prüfstatus als Reaktion auf die Enter-Taste umschaltet. Der erste Setter im Style, der den Anfangswert der IsExpanded-Eigenschaft jedes Elements auf true setzt, stellt sicher, dass Anforderung 8 erfüllt ist. Dieses Teil fügt das gesamte Puzzle zusammen. Beachten Sie, dass die angehängte Eigenschaft KeyboardNavigation.AcceptsReturn für jedes TreeViewItem auf true gesetzt ist, so dass der VirtualToggleButton seinen Prüfstatus als Reaktion auf die Enter-Taste umschaltet. Der erste Setter im Style, der den Anfangswert der IsExpanded-Eigenschaft jedes Elements auf true setzt, stellt sicher, dass Anforderung 8 erfüllt ist.
  
-CheckBox-Fehler im Aero-Thema+=== CheckBox-Fehler im Aero-Design ===
 Ich muss auf ein seltsames und enttäuschendes Problem hinweisen. Das Aero-Thema für das CheckBox-Steuerelement von WPF hat ein Problem in .NET 3.5. Wenn es vom Zustand "Unbestimmt" in den Zustand "Geprüft" wechselt, wird der Hintergrund des Kästchens nicht richtig aktualisiert, bis Sie den Mauszeiger darüber bewegen. Sie können dies im folgenden Screenshot sehen: Ich muss auf ein seltsames und enttäuschendes Problem hinweisen. Das Aero-Thema für das CheckBox-Steuerelement von WPF hat ein Problem in .NET 3.5. Wenn es vom Zustand "Unbestimmt" in den Zustand "Geprüft" wechselt, wird der Hintergrund des Kästchens nicht richtig aktualisiert, bis Sie den Mauszeiger darüber bewegen. Sie können dies im folgenden Screenshot sehen:
  
 {{:start:visualstudio2017:programmieren:tipps_tricks:screenshot_aero.png?400|}} {{:start:visualstudio2017:programmieren:tipps_tricks:screenshot_aero.png?400|}}
- 
- 
- 
 </WRAP> </WRAP>
 </WRAP> </WRAP>
  
 +[[https://www.codeproject.com/Articles/28306/Working-with-Checkboxes-in-the-WPF-TreeView|Original Artike von Josh Smith.]] [[https://www.deepl.com/translator]|Erste Übersetzung mit Deepl.] [[|]]