UWP - ListViewItem IsSelected 绑定的绑定两种方式不采用初始值
UWP - Binding of ListViewItem IsSelected binding two way not taking initial value
大家好,我正在努力解决这个问题。我有一个名为“ROOT”的列表,我将其应用于此列表的 ItemTemplate“RootTemplate”。在“RootTemplate”中,我有另一个列表“BRANCH”和另一个模板“BranchTemplate”,我想要实现的是预先 select 其中一些 listViewItems 在 BRANCH 列表中。
<ResourceDictionary
<DataTemplate x:Key="RootTemplate" >
<ListViewItem>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="0"/>
<ColumnDefinition Width="Auto" MinWidth="0"/>
</Grid.ColumnDefinitions>
<ListView ItemsSource="{Binding Branches}" ItemTemplate="{StaticResource BranchTemplate}" SelectionMode="Multiple"/>
</Grid>
</ListViewItem>
</DataTemplate>
<DataTemplate x:Key="BranchTemplate">
<ListViewItem IsSelected="{Binding IsChecked, Mode=TwoWay}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Width="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}"/>
</Grid>
</ListViewItem>
</DataTemplate>
我的 ViewModel 很简单
public class Root: ReactiveObject
{
public ObservableCollectionExtended<Branch> Branches{ get; } = new ObservableCollectionExtended<Branch>();}
public class Branch: ReactiveObject
{
private bool _isChecked = true;
public bool IsChecked
{
get => _isChecked;
set
{
this.RaiseAndSetIfChanged(ref _isChecked, value);
}
}
private string _name;
public string Name
{
get => _name;
set
{
this.RaiseAndSetIfChanged(ref _name, value);
}
}}
在 BranchTemplate 中,我将 IsSelected 绑定到 IsChecked 属性。它工作正常,当我单击列表 IsChecked 时相应更改,当我(在 -运行 时间)更改 IsChecked 属性 时,我可以看到更改反映在 UI 上。但我无法将 IsChecked 初始化为 true(如您所见代码)。即使我这样做,然后当我 运行 应用程序 IsChecked 它自动设置回 false,并且在 UI listItems 不是 selected.
参考 document(其中提到“如果您设置控件模板的样式,请不要尝试在 ListViewItemPresenter 上绑定诸如 IsSelected 或 Background 属性之类的属性,也许是为了实现您自己的选择绑定系统,因为您的绑定可能被控件的内部机制所取代。"),IsSelected
属性 of ListViewItem
无法初始化的原因可能是初始化绑定被控件的内部机制所取代。
正如您提到的,您可以在代码中设置 IsChecked
的值来更改 ListViewItem
的 IsSelected
属性 和 [=13= 的值]会在点击ListView
中的某个项目时发生变化,这表明双向数据绑定可以工作。因此,您可以通过添加 Loading
事件来解析 IsSelected
属性.[= 的初始化绑定,从而强制选择名为 BRANCH
的 ListView
的某些项目。 23=]
例如:
……
<ListView ItemsSource="{Binding Branches}" ItemTemplate="{StaticResource BranchTemplate}" SelectionMode="Multiple" Loading="ListView_Loading"/>
……
private void ListView_Loading(FrameworkElement sender, object args)
{
var list = sender as ListView;
var root = list.DataContext as Root; //Adjust the type to your scenario
for (int i = 0; i < root.Branches.Count; i++)
{
var item = root.Branches.ElementAt(i);
if (item.IsChecked == true)
{
list.SelectedItems.Add(list.Items.ElementAt(i));
}
}
}
大家好,我正在努力解决这个问题。我有一个名为“ROOT”的列表,我将其应用于此列表的 ItemTemplate“RootTemplate”。在“RootTemplate”中,我有另一个列表“BRANCH”和另一个模板“BranchTemplate”,我想要实现的是预先 select 其中一些 listViewItems 在 BRANCH 列表中。
<ResourceDictionary
<DataTemplate x:Key="RootTemplate" >
<ListViewItem>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="0"/>
<ColumnDefinition Width="Auto" MinWidth="0"/>
</Grid.ColumnDefinitions>
<ListView ItemsSource="{Binding Branches}" ItemTemplate="{StaticResource BranchTemplate}" SelectionMode="Multiple"/>
</Grid>
</ListViewItem>
</DataTemplate>
<DataTemplate x:Key="BranchTemplate">
<ListViewItem IsSelected="{Binding IsChecked, Mode=TwoWay}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Width="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}"/>
</Grid>
</ListViewItem>
</DataTemplate>
我的 ViewModel 很简单
public class Root: ReactiveObject
{
public ObservableCollectionExtended<Branch> Branches{ get; } = new ObservableCollectionExtended<Branch>();}
public class Branch: ReactiveObject
{
private bool _isChecked = true;
public bool IsChecked
{
get => _isChecked;
set
{
this.RaiseAndSetIfChanged(ref _isChecked, value);
}
}
private string _name;
public string Name
{
get => _name;
set
{
this.RaiseAndSetIfChanged(ref _name, value);
}
}}
在 BranchTemplate 中,我将 IsSelected 绑定到 IsChecked 属性。它工作正常,当我单击列表 IsChecked 时相应更改,当我(在 -运行 时间)更改 IsChecked 属性 时,我可以看到更改反映在 UI 上。但我无法将 IsChecked 初始化为 true(如您所见代码)。即使我这样做,然后当我 运行 应用程序 IsChecked 它自动设置回 false,并且在 UI listItems 不是 selected.
参考 document(其中提到“如果您设置控件模板的样式,请不要尝试在 ListViewItemPresenter 上绑定诸如 IsSelected 或 Background 属性之类的属性,也许是为了实现您自己的选择绑定系统,因为您的绑定可能被控件的内部机制所取代。"),IsSelected
属性 of ListViewItem
无法初始化的原因可能是初始化绑定被控件的内部机制所取代。
正如您提到的,您可以在代码中设置 IsChecked
的值来更改 ListViewItem
的 IsSelected
属性 和 [=13= 的值]会在点击ListView
中的某个项目时发生变化,这表明双向数据绑定可以工作。因此,您可以通过添加 Loading
事件来解析 IsSelected
属性.[= 的初始化绑定,从而强制选择名为 BRANCH
的 ListView
的某些项目。 23=]
例如:
……
<ListView ItemsSource="{Binding Branches}" ItemTemplate="{StaticResource BranchTemplate}" SelectionMode="Multiple" Loading="ListView_Loading"/>
……
private void ListView_Loading(FrameworkElement sender, object args)
{
var list = sender as ListView;
var root = list.DataContext as Root; //Adjust the type to your scenario
for (int i = 0; i < root.Branches.Count; i++)
{
var item = root.Branches.ElementAt(i);
if (item.IsChecked == true)
{
list.SelectedItems.Add(list.Items.ElementAt(i));
}
}
}