DataGrid 失去选择
DataGrid loses selection
有一个包含产品的类别集合。
每个类别在界面中都由 AvalonDock 选项卡表示,该选项卡具有包含产品的 DataGrid。
现在,当从一个选项卡切换到另一个选项卡时,DataGrid 每次都会更新集合。如果您 select 在第一个选项卡的 table 中的一对行,切换到第二个选项卡并 return 到第一个选项卡,selection 消失。
可能是什么问题?
XAML:
<xcad:DockingManager DocumentsSource="{Binding Examples}">
<xcad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding Content.Items}"
SelectionMode="Extended" />
</DataTemplate>
</xcad:DockingManager.LayoutItemTemplate>
<xcad:LayoutRoot />
</xcad:DockingManager>>
代码隐藏:
public partial class MainWindow : Window
{
public class Example
{
public List<int> Items { get; } = new List<int>();
public Example()
{
for (var i = 0; i < 10; i++)
{
Items.Add(i);
}
}
}
public List<Example> Examples { get; } = new List<Example>();
public MainWindow()
{
InitializeComponent();
DataContext = this;
Examples.Add(new Example());
Examples.Add(new Example());
}
}
正如@nobody 所建议的,在选项卡之间切换似乎更新了布局,并且选择状态丢失了。如果 UI 不能保持选择状态,那么你可以使用下一层,即展示或视图模型来做同样的事情。
在这种情况下,将 IsSelected
属性 添加到视图模型项并绑定到 ListViewItem
应该可以解决问题。
XAML:
<Grid>
<xcad:DockingManager DocumentsSource="{Binding Examples}">
<xcad:DockingManager.DocumentHeaderTemplate>
<DataTemplate>
<TextBlock Text="Doc" />
</DataTemplate>
</xcad:DockingManager.DocumentHeaderTemplate>
<xcad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<ListBox
DisplayMemberPath="Value"
ItemsSource="{Binding Content.Items}"
SelectionMode="Extended">
<ListBox.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightBlue" />
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</ListBox.Resources>
</ListBox>
</DataTemplate>
</xcad:DockingManager.LayoutItemTemplate>
<xcad:LayoutRoot />
</xcad:DockingManager>
</Grid>
代码隐藏:
public partial class MainWindow : Window
{
public class ExampleItem
{
public int Value { get; set; }
public bool IsSelected { get; set; }
}
public class Example
{
public List<ExampleItem> Items { get; } = new List<ExampleItem>();
public Example()
{
for (var i = 0; i < 10; i++)
{
Items.Add(new ExampleItem { Value = i });
}
}
}
public List<Example> Examples { get; } = new List<Example>();
public MainWindow()
{
InitializeComponent();
DataContext = this;
Examples.Add(new Example());
Examples.Add(new Example());
}
}
有一个包含产品的类别集合。
每个类别在界面中都由 AvalonDock 选项卡表示,该选项卡具有包含产品的 DataGrid。
现在,当从一个选项卡切换到另一个选项卡时,DataGrid 每次都会更新集合。如果您 select 在第一个选项卡的 table 中的一对行,切换到第二个选项卡并 return 到第一个选项卡,selection 消失。
可能是什么问题?
XAML:
<xcad:DockingManager DocumentsSource="{Binding Examples}">
<xcad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding Content.Items}"
SelectionMode="Extended" />
</DataTemplate>
</xcad:DockingManager.LayoutItemTemplate>
<xcad:LayoutRoot />
</xcad:DockingManager>>
代码隐藏:
public partial class MainWindow : Window
{
public class Example
{
public List<int> Items { get; } = new List<int>();
public Example()
{
for (var i = 0; i < 10; i++)
{
Items.Add(i);
}
}
}
public List<Example> Examples { get; } = new List<Example>();
public MainWindow()
{
InitializeComponent();
DataContext = this;
Examples.Add(new Example());
Examples.Add(new Example());
}
}
正如@nobody 所建议的,在选项卡之间切换似乎更新了布局,并且选择状态丢失了。如果 UI 不能保持选择状态,那么你可以使用下一层,即展示或视图模型来做同样的事情。
在这种情况下,将 IsSelected
属性 添加到视图模型项并绑定到 ListViewItem
应该可以解决问题。
XAML:
<Grid>
<xcad:DockingManager DocumentsSource="{Binding Examples}">
<xcad:DockingManager.DocumentHeaderTemplate>
<DataTemplate>
<TextBlock Text="Doc" />
</DataTemplate>
</xcad:DockingManager.DocumentHeaderTemplate>
<xcad:DockingManager.LayoutItemTemplate>
<DataTemplate>
<ListBox
DisplayMemberPath="Value"
ItemsSource="{Binding Content.Items}"
SelectionMode="Extended">
<ListBox.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightBlue" />
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</ListBox.Resources>
</ListBox>
</DataTemplate>
</xcad:DockingManager.LayoutItemTemplate>
<xcad:LayoutRoot />
</xcad:DockingManager>
</Grid>
代码隐藏:
public partial class MainWindow : Window
{
public class ExampleItem
{
public int Value { get; set; }
public bool IsSelected { get; set; }
}
public class Example
{
public List<ExampleItem> Items { get; } = new List<ExampleItem>();
public Example()
{
for (var i = 0; i < 10; i++)
{
Items.Add(new ExampleItem { Value = i });
}
}
}
public List<Example> Examples { get; } = new List<Example>();
public MainWindow()
{
InitializeComponent();
DataContext = this;
Examples.Add(new Example());
Examples.Add(new Example());
}
}