Установка фильтра на CollectionViewSource, привязанном к ComboBox в WPF Автоматически выбирает первый элемент - PullRequest
0 голосов
/ 29 октября 2018

Я решил проблему невозможности фильтровать списки со списком по различным критериям, используя CollectionViewSource и ICollectionView, но теперь у меня возникла другая проблема.

Когда я устанавливаю эти фильтры, он автоматически выбирает первый элемент в фильтре, когда я не хочу, чтобы что-либо выбиралось, я просто хочу, чтобы элементы там можно было выбирать.

Есть ли способ установить фильтры без их автоматического выбора первых элементов?

Даже когда я устанавливаю свойство, с которым оно связано, RoleStr (хорошо общедоступное свойство, технически _roleStr является частным, которое оно использует) обратно в "", Combobox начинается с первого элемента в показе FilteredView.

Combobox still shows a value in it, when I simply want it to show up as blank.

XAML:

<ComboBox  x:Name="empRoleCB" Height="20" Width="175" HorizontalAlignment="Left"   VerticalAlignment="Top" Margin="0,5" IsEnabled="{Binding ElementName=empDeptCB, Path=Text.Length, Mode=OneWay}"   ItemsSource="{Binding Path=MyRoleFilter}" SelectedItem="{Binding RoleStr}" SelectionChanged="empDeptCB_SelectionChanged" Loaded="empRoleCB_Loaded"/>

ViewModel:

public partial class EmployeeMenu : Window
{
    EmployeeMenuVM empVM = new EmployeeMenuVM();
    public EmployeeMenu()
    {

        DataContext = empVM;
        empVM.MyRoleFilter = new CollectionViewSource { Source = empVM.Role }.View;

        InitializeComponent();
    }
    private void empRoleCB_Loaded(object sender, RoutedEventArgs e)
    {
        if(loggedUser[0].Role == (int)Roles.SrMgr)
        {
            empVM.MyRoleFilter.Filter = a => { return (string)a == Roles.Mgr.ToString() || (string)a == Roles.TeamLead.ToString() || (string)a == Roles.User.ToString(); };
        }
        else if(loggedUser[0].Role == (int)Roles.Mgr)
        {
            empVM.MyRoleFilter.Filter = a => { return (string)a == Roles.TeamLead.ToString() || (string)a == Roles.User.ToString(); };
        }
       else if (loggedUser[0].Role == (int)Roles.TeamLead)
        {
            empVM.MyRoleFilter.Filter = a => { return  (string)a == Roles.User.ToString(); };
        }

        empVM.RoleStr = "";
    }

Вид:

private ObservableCollection<string> _role = new ObservableCollection<string>(Enum.GetNames(typeof(Global.Roles)));
private string _roleStr;
public IEnumerable<string> Role { get => _role; }
public ICollectionView MyRoleFilter { get; set; }
public string RoleStr
{
     get => _roleStr;
     set => SetProperty(ref _roleStr, value);
}

ОБНОВЛЕНИЕ ОБНОВЛЕНО:

Мне пришлось вручную установить свойство Combobox.Text на пустое после запуска фильтров, и это решило проблему.

1 Ответ

0 голосов
/ 29 октября 2018

Удалить SelectedItem. Добавить IsSynchronizedWithCurrentItem="True".

ICollectionView обрабатывает текущий элемент внутренне. Вы можете запросить его через свойство ICollectionView.CurrentItem.

...