WinRT xaml ToolKit TreeViewコンポーネントは、UWPでネイティブにサポートされていないため、現在使用しようとしています。UWP - WinRT xamlツールキットFlyViewのTreeView、フライアウト終了後の選択を変更します。
TreeViewはボタンフライアウトの中にあります。ボタンを押すとフライアウトが表示され、ツリーからアイテムを選択できます。そして、私はViewModelにからSelectedItemChangedイベントにコマンドをバインドします
<Button
x:Name="btnFilter"
HorizontalAlignment="Right"
Command="{Binding OpenFiltersCommand}"
Style="{StaticResource SecondaryMenuButtonStyle}">
<StackPanel Orientation="Horizontal">
<Image
Width="28"
Margin="0,0,4,0"
Source="{StaticResource FilterIcon}" />
<TextBlock x:Uid="Filter" Style="{StaticResource GrayTextBlockStyle}" />
</StackPanel>
<FlyoutBase.AttachedFlyout>
<controls1:CustomFlyout IsOpen="{Binding IsFiltersOpen, Mode=TwoWay}" Parent="{Binding ElementName=btnFilter}">
<controls2:TreeView
ItemContainerStyle="{StaticResource DefaultTreeViewItem}"
ItemTemplate="{StaticResource TreeViewItemTemplate}"
ItemsSource="{Binding BuildingTree}"
Style="{StaticResource DefaultTreeViewStyle}">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="SelectedItemChanged">
<core:InvokeCommandAction Command="{Binding ChangeRoomCommand}" />
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</controls2:TreeView>
</controls1:CustomFlyout>
</FlyoutBase.AttachedFlyout>
</Button>
私はツリービューから項目を選択した後、それは必要がありますが、その後、私は再びフライアウトとイベントが発生を閉じるなどSelectedItemChangedイベントが発生します。 2回目は通常、新しい選択された要素が現在の親の次にあるということを示します。私が最初に--1.1要素で発生しますSelectedItemChanged --1.1選択するのであれば
1
--1.0
--1.1
--1.2
2
--2.0
--2.1
、そしてその後、新しい選択項目として2で発生します。したがって、たとえば、私はこのような構造を持っている場合。
注:私はViewModelから閉じることができるCustomFlyoutコンポーネントを使用していますが、通常のFlyoutでこれをテストしましたが、フライアウトを外にクリックして同様のことが起こります。
更新:私はWinRTコードをダウンロードし、ローカルにTreeViewコンポーネントのデバッグを開始しました。 TreeViewItem.csでは、私はこの機能に問題の原因を見つけた:
protected override void OnGotFocus(RoutedEventArgs e)
{
// Since the GotFocus event will bubble up to the parent
// TreeViewItem (which will make it think it's also selected), it
// needs to ignore that event when it's first been handled by one of
// its nested children. We use the IgnoreNextGotFocus flag to
// notify our parent that GotFocus has already been handled.
TreeViewItem parent = ParentTreeViewItem;
if (parent != null)
{
parent.CancelGotFocusBubble = true;
}
try
{
if (Interaction.AllowGotFocus(e) && !CancelGotFocusBubble)
{
// Select the item when it's focused
Select(true);
// ActivateAsync the selection
IsSelectionActive = true;
UpdateVisualState(true);
Interaction.OnGotFocusBase();
base.OnGotFocus(e);
}
}
finally
{
CancelGotFocusBubble = false;
}
}
要素は、それが親だ見つけると、ツリーに上向きにイベントを伝播防止に失敗した時にフォーカスを取得したときに、私が言うことができるものから。
私も、私が以前に言ったように、しかし、私は(ハードフィックス)を防止するために管理WinRTのツリービューのコンポーネントで、これはバグであると思われる彼らのgithubのリポジトリ