Выбранный элемент Всегда отменять выбор (C#)

Я реализую список, когда я выбираю элемент в списке, он появляется в текстовом блоке «MiniTextBlock», но я хочу, когда текст текстового блока изменяется вручную или текст текстового блока не равен выбранному элементу в списке, тогда это выбранный элемент должен быть отменен из списка.

DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.4) };
timer.Tick += delegate (object sender, object e)
{

    if(selectedItem != null && selectedItem.ToString() != MiniTextBlock.Text)
    {
        FavoritesListBox.SelectedIndex = -1;
    }
};
timer.Start();

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

Полные примеры кодов

XAML

<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <TextBlock Name="MiniTextBlock" Text="35" FontSize="50" VerticalAlignment="Top" HorizontalAlignment="Center"/>

        <ListBox Name="FavoritesListBox" VerticalAlignment="Center">
            <ListBoxItem>
                <TextBlock Text="36" FontSize="30"/>
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="35" FontSize="30"/>
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="34" FontSize="30"/>
            </ListBoxItem>
        </ListBox>
    </StackPanel>

С#

public MainPage()
{
    this.InitializeComponent();
    DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.4) };
    timer.Tick += delegate (object sender, object e)
    {
        var selectedItem = FavoritesListBox.SelectedItem;

        if (selectedItem != null && selectedItem.ToString() != MiniTextBlock.Text)
        {
            FavoritesListBox.SelectedIndex = -1;
        }
    };
    timer.Start();
}

ВЫВОД

Вывод


person Arpit Jain    schedule 14.10.2017    source источник
comment
Вероятно, тот факт, что вы установили индекс, приводит к тому, что вы снова запускаете событие, и что SelectedItem теперь равно null.   -  person Willem Van Onsem    schedule 14.10.2017
comment
Я думаю, что при изменении вашего события значение ddl очищается. Кроме того, вы можете проверить это до вашего состояния. if(!string.IsNullorEmpty(FavoritesListBox.SelectedItem.ToString())){if(FavoritesListBox.SelectedItem.ToString() != MiniTextBLock.Text) { FavoritesListBox.SelectedIndex = -1; }}   -  person Deepak    schedule 14.10.2017
comment
может быть возможно, потому что я вставляю его в DispatcherTimer, чтобы он проверял, изменен ли элемент в текстовом блоке или нет, как я могу с этим справиться   -  person Arpit Jain    schedule 14.10.2017
comment
@Deepak проверяет .......   -  person Arpit Jain    schedule 14.10.2017


Ответы (2)


Поскольку вы не привязываете источник к ListBox, SelectedItem на самом деле является ListBoxItem, а не string. Вам нужно будет развернуть и найти фактический текст, например:

timer.Tick += delegate (object sender, object e)
{
    var selectedItem = (ListBoxItem)FavoritesListBox.SelectedItem;

    if (selectedItem == null)
    {
        return;
    }

    var tb = (TextBlock)selectedItem.Content;

    if (tb.Text != MiniTextBlock.Text)
    {
        FavoritesListBox.SelectedIndex = -1;
    }
};
person Laith    schedule 15.10.2017
comment
In - var tb = (TextBlock)selectedItem.Content; , Контент недоступен или недействителен - person Arpit Jain; 15.10.2017
comment
Ух ты ! теперь он работает, спасибо вам;) на самом деле я буду использовать его в списке, который содержит текстовый текстовый блок с привязкой текста в шаблоне данных. я делаю вышеприведенный образец для простого ответа на мой вопрос, давайте посмотрим, как он будет работать над этим - person Arpit Jain; 15.10.2017
comment
Это исключение, если я использовал в своем фактическом списке (вопрос, обновленный с фактическим текстовым блоком), выглядит так, потому что я использую шаблон элемента › datatamplate › текстовый блок, вы можете найти это - person Arpit Jain; 15.10.2017
comment
хорошо, я обновляю больше, это хранилище, которое содержит все элементы, даже если приложение закрывается, на самом деле я использую этот метод bsubramanyamraju.blogspot.in/2014/01/ - person Arpit Jain; 15.10.2017
comment
Ok. Каким бы ни был ваш список, вам нужно знать, что SelectedItem будет этого типа. Итак, если ItemsSource = List<string>, FavoritesListBox.SelectedItem будет типа string. Понятно? - person Laith; 15.10.2017
comment
да, мой элемент является строкой, поэтому я конвертирую SelectedItem.ToString, но не могли бы вы объяснить еще один ответ на обновление, пожалуйста :(.... старый ответ работает, если я использую напрямую listboxitem, поэтому не удаляйте его также - person Arpit Jain; 15.10.2017
comment
Давайте продолжим это обсуждение в чате. - person Arpit Jain; 15.10.2017
comment
я задал отдельный вопрос для моей новой проблемы - person Arpit Jain; 27.10.2017

Я предполагаю, что вы запускаете событие снова, устанавливая SelectedIndex на -1, в результате SelectedItem становится null. В любом случае, в этом случае быстрое решение состоит в том, чтобы защитить оператор if с помощью возможного null:

var selectedItem = FavoritesListBox.SelectedItem;

if(selectedItem != null && selectedItem.ToString() != MiniTextBLock.Text)
{
    FavoritesListBox.SelectedIndex = -1;
}
person Willem Van Onsem    schedule 14.10.2017
comment
он работает, но отменяет выбор элемента, даже если выбранный элемент и элемент текстового блока совпадают - person Arpit Jain; 14.10.2017
comment
@ArpitJain: вы уверены, что оба одинаковы? Вам лучше запустить отладчик и проверить, полностью ли они совпадают. Пробелы, (верхний) регистр и т. д. могут иметь значение. - person Willem Van Onsem; 14.10.2017
comment
точно так же, потому что ранее этот элемент добавлялся в список из этого текстового блока, и это цифра без шансов на верхний и нижний регистр - person Arpit Jain; 14.10.2017
comment
@ArpitJain: я бы посоветовал проверить это в отладчике. Так как MiniTextBLock тоже может измениться и т.д. - person Willem Van Onsem; 14.10.2017
comment
Не в состоянии понять, что происходит, я обновляю свой вопрос простыми примерами кода. - person Arpit Jain; 15.10.2017