2012-06-22 4 views
2

В приложении MVVM Silverlight пользователь может ввести текст в TextBox и соответствующим образом изменить содержимое ListBox. Например: если пользователь вводит «ТВ», ListBox заполняет все доступные телевизионные марки, и пользователь может выбрать продукт из записей ListBox и ListBox; затем, если он войдет в «компьютер», содержимое ListBox изменится и заполнится с помощью ComputerNames.ClearSelection в ListBox MVVM

Как только пользователь вводит что-то, он ищет в словаре со значениями, соответствующими ключу.

Вид:

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

Как только ключевые матчи пользователя строку ввода ('TV') он заполняет ObservableCollection<string> DataList с tvList, который связан в ListBox. Пользователь типа камеры, он очищает dataList и добавляет CameraList. Проблема здесь. Выбор listBox не очищается, когда он очищает данные и заполняется новыми данными. Один и тот же элемент в выбранном ранее месте остается выбранным. Я попытался установить SelectedIndex равным -1 из свойства UserSelectedItem в ViewModel, но это не сработало.

+0

Я не понимаю, вы хотите, чтобы очистить ListBox при изменении выбора ListBox? –

+0

Очистите список, как только пользователь выберет элемент из списка. – Prathibha

ответ

1

Вы также можете установить userSelectedItem=null в

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

Спасибо user1002386 – Prathibha

2

Я думаю, что у вас могут быть смутные свойства. Когда в ListBox делается выбор, запускается установщик UserSelectedItem и очищает dataList и устанавливает LBoxSelectedIndex в -1. Так что действительно, когда пользователь выбирает элемент из списка, ListBox очищается, и ничего не выбрано.

Вместо этого, кажется, вы должны очистить выбор при изменении DataList.

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

Вам также нужно очистить DataList когда SearchStr обновляется и не равно любой из ключей в отсортированном словаре.

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"); 
    } 
} 
Смежные вопросы