每当我在TabControl中切换选项卡时,都会重置ListBox选定项 [英] ListBox Selected Items are reset each time I switch tabs in may TabControl

查看:70
本文介绍了每当我在TabControl中切换选项卡时,都会重置ListBox选定项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下TabControl:

I have the following TabControl:

<TabControl Name="tabControl" Grid.Row="0" MinWidth="270" HorizontalAlignment="Stretch" ItemsSource="{Binding Counters}" ContentTemplate="{StaticResource templateForTheContent}"
        ItemTemplate="{StaticResource templateForTheHeader}">
</TabControl>

它使用此DataTemplate:

It uses this DataTemplate:

<Window.Resources>

            <DataTemplate x:Key="templateForTheContent" >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="1*"/>
                    <RowDefinition  Height="Auto"/>
                </Grid.RowDefinitions>
                <ListBox Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" 
                         ItemsSource="{Binding}"
                         SelectionMode="Multiple"
                             BorderThickness="1" BorderBrush="#FF8B8B8B" SelectionChanged="ListBox_SelectionChanged_1">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock>
                                <Run Text="{Binding CounterName, Mode=OneWay}" />
                                <Run Text="{Binding InstanceName, Mode=OneWay}" />
                            </TextBlock>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <Button Name="RAMSelectAllButton" Margin="0,10,0,0" Grid.Column="0" Grid.Row="1">
                    <TextBlock Text="SELECT ALL"/>
                </Button>
                <Button Name="RAMUnSelectAllButton" Margin="0,10,0,0" Grid.Column="1" Grid.Row="1">
                    <TextBlock Text="UNSELECT ALL"/>
                </Button>
            </Grid>
        </DataTemplate>

            <DataTemplate x:Key="templateForTheHeader" >
                <TextBlock Text="{Binding CategoryName}"/>
            </DataTemplate>

        </Window.Resources>

它按预期工作,绑定工作良好,如果不存在此问题,一切都会很好: 每次我在TabControl中切换一个标签时,上一个标签中的ListBox的选定项目都会被重置-因此,当我返回该标签时,不会选择任何内容.

It works as expected, binding works well, everything would be totally fine if this issue wasn't present: Each time I switch a tab in my TabControl, selected items of a ListBox in my previous tab are reset - so when I go back to that tab - nothing is selected.

该如何解决?

//编辑 这是我的ListBox_SelectionChanged_1方法:

//EDIT here's my ListBox_SelectionChanged_1 method:

private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    System.Windows.Controls.ListBox listBoxTemp = sender as System.Windows.Controls.ListBox;
    PerformanceCounter counterTemp = (PerformanceCounter)listBoxTemp.Items[0];

    if (!appData.SelectedCounters.ContainsKey(counterTemp.CategoryName))
        appData.SelectedCounters.Add(counterTemp.CategoryName, new List<PerformanceCounter>());

    appData.SelectedCounters[counterTemp.CategoryName].Clear();

    foreach (PerformanceCounter counter in listBoxTemp.SelectedItems)
    {
        appData.SelectedCounters[counterTemp.CategoryName].Add(counter);
    }

}

ListBox绑定到Counters,这是Observable Collection:

ListBox is bound to Counters, which is Observable Collection:

public ObservableCollection<ObservableCollection<PerformanceCounter>> Counters
{
    get { return _Counters; }
}
ObservableCollection<ObservableCollection<PerformanceCounter>> _Counters = new ObservableCollection<ObservableCollection<PerformanceCounter>>();

推荐答案

(对此我不熟悉TabControl或WPF,但我建议这样的解决方案:)

(i am not familiar with TabControls, or WPF for that matter, but i would suggest a solution like this:)

在字典"中备份列表框的选定项.

Backup the selected items of your ListBox in a Dictionary.

var selectionBackups = new Dictionary<ListBox, IEnumerable<ListBoxItem>>();

我将在ListBox_SelectionChanged_1()中保持此字段的更新.每当您输入选项卡时,都将覆盖相关的ListBox选择.

I'd keep this field updated in ListBox_SelectionChanged_1(). Whenever you enter a Tab, overwrite the concerned ListBox's selection.

void TabEnter(object sender, TabEventArgs e)
{
    ListBox lb = ... //acquire the current Listbox
    OverwriteSelection(lb, selectionBackups[lb]); //set the ListBox's selection
}

(您可能希望在恢复选择时阻止ListBox_SelectionChanged_1()触发.可以这样做:

(You might want to prevent the ListBox_SelectionChanged_1() from triggering when you restore the selection. That could be done like this:

bool auto_select = false; //set this to true while editing selections
private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    if(auto_select)
        return;
    ...
}

)

这篇关于每当我在TabControl中切换选项卡时,都会重置ListBox选定项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆