我有一個顯示專案串列的 WinUI 3 ListView。每個專案都有一個 ToggleSwitch 和一個 Expander。當我單擊 ToggleSwitch 或 Expander 時,ListView 選擇不會改變。
我為 WPF 找到了一些解決方案,但它們在 WinUI 3 中不起作用:
在串列框中選擇文本框項不會更改串列框的選定項
如何為 WinUI 3 執行此操作,以便在選擇 ToggleSwitch 或 Expander 時選擇關聯的 ListViewItem?
uj5u.com熱心網友回復:
您可以處理 and 的Tapped事件Expander并以ToggleSwitch編程方式設定 的SelectedItem屬性ListView:
private void OnTapped(object sender, TappedRoutedEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
lv.SelectedItem = element.DataContext;
}
XAML:
<ListView x:Name="lv">
<ListView.ItemTemplate>
<DataTemplate>
...
<Expander Tapped="OnTapped" ... />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
uj5u.com熱心網友回復:
如果您不想在以編程方式執行某些操作時更改選擇,則可以這樣做。
.xaml
<StackPanel>
<Button
Command="{x:Bind ViewModel.TestCommand}"
Content="Click" />
<ListView
x:Name="ListViewControl"
ItemsSource="{x:Bind ViewModel.Items}"
SelectionMode="Single">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Item">
<StackPanel>
<ToggleSwitch Toggled="ToggleSwitch_Toggled" />
<Expander Expanding="Expander_Expanding" IsExpanded="{x:Bind IsChecked, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
.xaml.cs
private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
{
if (ViewModel.IsProgrammatical is false)
{
ListViewControl.SelectedItem = (sender as ToggleSwitch)?.DataContext;
}
}
private void Expander_Expanding(Expander sender, ExpanderExpandingEventArgs args)
{
if (ViewModel.IsProgrammatical is false)
{
ListViewControl.SelectedItem = sender.DataContext;
}
}
視圖模型.cs
public partial class Item : ObservableObject
{
[ObservableProperty]
private string text = string.Empty;
[ObservableProperty]
private bool isChecked;
}
public partial class MainWindowViewModel : ObservableObject
{
public bool IsProgrammatical { get; set; }
[ObservableProperty]
private List<Item> items = new()
{
{ new Item() { Text = "A", IsChecked = false,} },
{ new Item() { Text = "B", IsChecked = false,} },
{ new Item() { Text = "C", IsChecked = false,} },
};
[RelayCommand]
private void Test()
{
IsProgrammatical = true;
Items[1].IsChecked = !Items[1].IsChecked;
IsProgrammatical = false;
}
}
解決方法
在這種情況下,源集合是不可觸摸的,如果屬性以編程方式更改,我們不能使用標志,我們需要使用Tapped事件來選擇專案。但不幸的是,ToggleSwitch'Tapped事件沒有被觸發(至少在我的環境中)。可能是WinUI錯誤(此處發布的問題)。
作為一種解決方法,至少在此錯誤得到修復之前,您可以使用ToggleButton. 我對其進行了測驗,并Tapped觸發了該事件。
<DataTemplate x:DataType="local:Item">
<StackPanel>
<ToggleButton Tapped="ToggleButton_Tapped" />
<Expander Tapped="Expander_Tapped" IsExpanded="{x:Bind IsChecked, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
private void ToggleButton_Tapped(object sender, TappedRoutedEventArgs e)
{
ListViewControl.SelectedItem = (sender as ToggleSwitch)?.DataContext;
}
private void Expander_Tapped(Expander sender, TappedRoutedEventArgs e)
{
ListViewControl.SelectedItem = sender.DataContext;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506313.html
