2012-06-22 3 views
2

Dans une application MVVM Silverlight, l'utilisateur peut entrer du texte dans la zone de texte et le contenu de ListBox change en conséquence. E.g .: Si l'utilisateur saisit "TV", la ListBox remplira toutes les marques de télévision disponibles et l'utilisateur pourra sélectionner un produit parmi les entrées ListBox et ListBox; Ensuite, s'il entre "ordinateur" contenu ListBox changer et remplir avec ComputerNames.ClearSelection dans ListBox MVVM

Dès que l'utilisateur saisit quelque chose, il recherche dans un dictionnaire avec des valeurs correspondant à la clé.

Vue:

<TextBox Name="SearchTBox" Text="{Binding SearchStr,UpdateSourceTrigger=PropertyChanged}" /> 
<ListBox Name="AnalysisLBox" ItemsSource="{Binding DataList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
     SelectedItem="{Binding UserSelectedItem,Mode=TwoWay}"         
     Width="250" BorderBrush="Transparent" SelectedIndex="{Binding LBoxSelectedIndex,Mode=TwoWay}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

ViewModel:

SortedDictionary Data() 
{ 
    List<string> tvList = new List<string>() { "Sony", "SamSung", "LG","Sharp" }; 
    List<string> computerList = new List<string>() { "HP","Dell","Lenovo","Gateway" }; 
    List<string> cameraList = new List<string>() { "Nikon","Sony","Panasonic" }; 
    SortedDictionary<string, List<string>> Data = new SortedDictionary<string, List<string>>(); 
    Data.Add("TV", billingList); 
    Data.Add("Computer", salesOutList); 
    Data.Add("Camera", customerAllocationList); 
} 

ObservableCollection<string> dataList = new ObservableCollection<string>(); 
public ObservableCollection<string> DataList 
{ 
    get { return dataList ; } 
    set { dataList = value; NotifyPropertyChanged("DataList"); } 
} 

int lBoxSelectedIndex; 
public int LBoxSelectedIndex 
{ 
    get { return lBoxSelectedIndex; } 
    set { lBoxSelectedIndex = value; NotifyPropertyChanged("LBoxSelectedIndex"); } 
} 

string userSelectedItem; 
public string UserSelectedItem 
{ 
    get { return userSelectedItem; } 
    set 
    { 
     userSelectedItem = value; 
    dataList.Clear(); 
     LBoxSelectedIndex =-1; 
     NotifyPropertyChanged("UserSelectedItem"); 
    } 
} 

Dès qu'une chaîne utilisateur clés correspondances dactylographié ('TV'), il remplit un ObservableCollection<string> datalist avec tvList qui est lié à la ListBox. L'utilisateur tape Camera, efface la dataList et ajoute cameraList. Le problème se produit ici. La sélection de listBox n'est pas effacée lorsqu'elle efface les données et les remplit avec de nouvelles données. Le même élément à l'emplacement précédemment sélectionné reste sélectionné. J'ai essayé de définir SelectedIndex à -1 à partir de la propriété UserSelectedItem du ViewModel mais cela n'a pas fonctionné.

+0

Je ne comprends pas, vous voulez effacer la zone de liste lorsque la sélection change listbox? –

+0

Efface la zone de liste dès que l'utilisateur sélectionne un élément dans la zone de liste. – Prathibha

Répondre

1

Vous pouvez également définir userSelectedItem=null dans

ObservableCollection<string> dataList = new ObservableCollection<string>(); 
public ObservableCollection<string> DataList 
{ 
    get { return dataList ; } 
    set 
    { 
     dataList = value; 
     userSelectedItem=null 
     LBoxSelectedIndex = -1; 
     NotifyPropertyChanged("DataList"); 
    } 
} 
+0

Merci user1002386 – Prathibha

2

Je pense que vous pourriez avoir vos propriétés confuses. Lorsqu'une sélection est effectuée dans le ListBox, le setter UserSelectedItem est déclenché et efface le dataList et définit le LBoxSelectedIndex sur -1. Donc vraiment ce qui se passe quand un utilisateur sélectionne un élément de la ListBox est le ListBox est effacé et rien n'est sélectionné. Au lieu de cela, il semble que vous devriez effacer la sélection lorsque le DataList est modifié.

string userSelectedItem; 
public string UserSelectedItem 
{ 
    get { return userSelectedItem; } 
    set 
    { 
     userSelectedItem = value; 
     NotifyPropertyChanged("UserSelectedItem"); 
    } 
} 

ObservableCollection<string> dataList = new ObservableCollection<string>(); 
public ObservableCollection<string> DataList 
{ 
    get { return dataList ; } 
    set 
    { 
     dataList = value; 
     LBoxSelectedIndex = -1; 
     NotifyPropertyChanged("DataList"); 
    } 
} 

Vous aurez également besoin d'effacer le DataList quand SearchStr est mis à jour et il ne correspond pas à l'une des touches dans le dictionnaire trié.

string searchStr; 
public string SearchStr 
{ 
    get { return searchStr; } 
    set 
    { 
     searchStr = value; 
     LBoxSelectedIndex = -1; 
     if (string.IsNullOrEmpty(searchStr)) 
      DataList = null; 
     else 
     { 
      List<string> selectedValue; 
      if (Data.TryGetValue(searchStr, out selectedValue)) 
       DataList = new ObservableCollection<string>(selectedValue); 
      else 
       DataList = null; 
     } 
     NotifyPropertyChanged("SearchStr"); 
    } 
} 
Questions connexes