Collectionview 阻止 selectionchange
Collectionview preventing selectionchange
我遇到了可能与 collectionview 有关的问题。问题似乎是每个组都会跟踪自己的 selector,这将阻止程序在我 select 之前 selected 项目时触发新的 SelectionChanged 事件上一组。
示例:
第 1 组:
第 1 行
第 2 行(selected)
第 2 组:
第 1 行(selected)
如果我先打开第 1 组并单击第 2 行,然后切换到第 2 组和 select 第一行。如果我再次回到第 1 组并单击第 2 行,则不会触发事件,并且 selecteditem 将与第 2 组保持相同,直到我单击第 1 行。
这是一个问题,因为在某些情况下,一个组中可能只有 1 行。
我的 XAML 看起来像这样(删除了不相关的东西)。
<DataGrid
Margin="0,10,0,0"
SelectionMode="Single"
IsReadOnly="True"
Name="InvoiceGrid"
SelectedItem="{Binding SelectedDiscrepancy, UpdateSourceTrigger=PropertyChanged}"
RowDetailsVisibilityMode="{Binding RowDetailsVisible}"
ItemsSource="{Binding InvoiceDiscrepancies}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" BorderBrush="#FF002255" >
<Expander.Header>
<StackPanel Orientation="Horizontal">
<Textblocks for design here.../>
</StackPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<Columns here/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<style for animating the expanding/>
</DataGrid.RowStyle>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid>
<ListBox Name="listBox3"
SelectionMode="Single"
HorizontalContentAlignment="Stretch"
ItemTemplate="{StaticResource invoiceItemTemplate}"
ItemsSource="{Binding Invoices, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=DataContext.SelectedInvoice, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
</ListBox>
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
那么,有人知道解决方案是什么吗?是否可以在组之间设置一个 selector,或者我是否应该以某种方式清除 selector 当我 select 父数据网格中的新行时?
编辑:
Github 带有问题示例的 repo
https://github.com/Snuffsis/GroupingSelect
如果您不需要保留所有选定的列表框项目,您可以清除选择。
作为一个选项,您可以使用 null 值引发 PropertyChanged 以清除当前选择。
public Invoice SelectedInvoice
{
get => _selectedInvoice;
set
{
if (_selectedInvoice != value)
{
if (_selectedInvoice != null) // <- add the 'if' block
{
_selectedInvoice = null;
RaisePropertyChanged(() => SelectedInvoice);
}
_selectedInvoice = value;
RaisePropertyChanged(() => SelectedInvoice);
}
}
}
我遇到了可能与 collectionview 有关的问题。问题似乎是每个组都会跟踪自己的 selector,这将阻止程序在我 select 之前 selected 项目时触发新的 SelectionChanged 事件上一组。
示例:
第 1 组:
第 1 行
第 2 行(selected)
第 2 组:
第 1 行(selected)
如果我先打开第 1 组并单击第 2 行,然后切换到第 2 组和 select 第一行。如果我再次回到第 1 组并单击第 2 行,则不会触发事件,并且 selecteditem 将与第 2 组保持相同,直到我单击第 1 行。
这是一个问题,因为在某些情况下,一个组中可能只有 1 行。
我的 XAML 看起来像这样(删除了不相关的东西)。
<DataGrid
Margin="0,10,0,0"
SelectionMode="Single"
IsReadOnly="True"
Name="InvoiceGrid"
SelectedItem="{Binding SelectedDiscrepancy, UpdateSourceTrigger=PropertyChanged}"
RowDetailsVisibilityMode="{Binding RowDetailsVisible}"
ItemsSource="{Binding InvoiceDiscrepancies}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" BorderBrush="#FF002255" >
<Expander.Header>
<StackPanel Orientation="Horizontal">
<Textblocks for design here.../>
</StackPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<Columns here/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<style for animating the expanding/>
</DataGrid.RowStyle>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid>
<ListBox Name="listBox3"
SelectionMode="Single"
HorizontalContentAlignment="Stretch"
ItemTemplate="{StaticResource invoiceItemTemplate}"
ItemsSource="{Binding Invoices, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=DataContext.SelectedInvoice, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
</ListBox>
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
那么,有人知道解决方案是什么吗?是否可以在组之间设置一个 selector,或者我是否应该以某种方式清除 selector 当我 select 父数据网格中的新行时?
编辑: Github 带有问题示例的 repo https://github.com/Snuffsis/GroupingSelect
如果您不需要保留所有选定的列表框项目,您可以清除选择。
作为一个选项,您可以使用 null 值引发 PropertyChanged 以清除当前选择。
public Invoice SelectedInvoice
{
get => _selectedInvoice;
set
{
if (_selectedInvoice != value)
{
if (_selectedInvoice != null) // <- add the 'if' block
{
_selectedInvoice = null;
RaisePropertyChanged(() => SelectedInvoice);
}
_selectedInvoice = value;
RaisePropertyChanged(() => SelectedInvoice);
}
}
}