2016-09-09 10 views
0

月TabControlの中で、私はタブを切り替えるたびにリセットされて、私は次のTabControlを持っている:ListBoxの選択項目は

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

それは、この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の選択項目がリセットされます。そのタブに戻ると何も選択されません。

これを修正するにはどうすればよいですか?

// EDIT は、ここに私のListBox_SelectionChanged_1方法です:

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); 
    } 

} 

リストボックスがカウンターにバインドされ、監視可能なコレクションです:

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

私があればこれを処理することができるだろう現在選択されているタブでListBoxにアクセスできます。どうやってするの?私はIEnumerable listBoxList = tabControl.FindChildren ();を試しましたが、それは空です(ListBoxはありますが) – Loreno

+0

ListBoxをコレクションにバインドするとコード内の項目からIsSelectedプロパティにアクセスすることはできません。 ViewModelの対応するプロパティでバインディングを使用して管理する必要があります。 –

+0

ListBoxを使用しました。 SelectedItems – Loreno

答えて

1

(私はそのためにTabControlsに精通していないです、またはWPF問題は、私はこのような解決策を提案します:)

リストボックスの選択項目を辞書にバックアップします。

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

このフィールドはListBox_SelectionChanged_1()に更新しておきます。あなたがタブを入力するたびに、関係するListBoxの選択を上書きします。

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

(あなたが選択を復元するとき、トリガからListBox_SelectionChanged_1()ないようにしたいかもしれないが、このように行うことができます。

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

+0

母、私は全く同じ考えを持っていました。私はそれをしようとしているが、一つの問題がある。このTabEnterメソッドについてです。私はWPFでこれはtabControl_SelectionChanged()だと思う。だから私はこのイベントを追加して、あなたのコードのような現在のListBoxを取得したいと思います。私はここからFindVisualChildrenメソッドを使用しました:[リンク](http://stackoverflow.com/questions/974598/find-all-controls-in-wpf-window-by-type)それは私のListBoxを取得します。前のタブ - 現在のタブではありません。私はどのように現在選択されているタブの中にあるListBoxへのアクセスを取得するか分かりません。 – Loreno

+0

hmmは、EventArgsで指定された選択されたタブのインデックスですか?これは、タブの子の中でListBoxを見つけることができる場合に役立ちます。 – TheHowlingHoaschd

+0

ええ、それはSelectedIndexを持っています(それは正しいインデックスです、私はチェックしました)。現在選択されているタブ(tabControl.SelectedItem.First())のヘッダーにアクセスすることもできます。しかし、なぜそれが私に前のリストボックスを与えてくれるのですか?私もListBoxのイベントを通して見ましたが、私はこの状況のた​​めに大丈夫になるものは見当たりません。 Loaded()イベントがありますが、ListBoxが初めて表示されたときにのみ発生します。後で表示されません。 – Loreno

関連する問題