WPF ComboBox игнорирует отключенные обновления выбранных элементов

В следующем коде я ожидаю, что поле со списком вернется к исходному Selected_Item, однако это не так, поле со списком в окне всегда показывает любой новый элемент, который я выбираю (и не синхронизируется с моделью), я также пытался всегда вызывать OnPropertyChanged ("Выбранный_элемент"); независимо от того, является ли значение другим, и все же поле со списком показывает только что выбранный элемент и не синхронизируется. Скорее всего, я делаю это неправильно, но как быть правильным?

namespace WpfApplication8
{
    public class Context : INotifyPropertyChanged
    {
        #region Privates

        bool c_Disabled = false;

        #endregion

        #region Ctors

        public Context()
        {
            Items = new List<MyItem>();

            Items.Add(new MyItem("Item 1"));
            Items.Add(new MyItem("Item 2"));
            Items.Add(new MyItem("Item 3"));

            Selected_Item = Items[0];

            c_Disabled = true;
        }

        #endregion

        #region Properties

        public List<MyItem> Items
        {
            get;
            private set;
        }

        private MyItem c_Selected_Item;
        public MyItem Selected_Item
        {
            get { return c_Selected_Item; }
            set
            {
                if (c_Selected_Item != value)
                {
                    if (!c_Disabled)
                    {
                        c_Selected_Item = value;

                        OnPropertyChanged("Selected_Item");
                    }

                }
            }
        }


        #endregion

        #region INotifyPropertyChanged implementation

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string f_Prop_Name)
        {
            PropertyChangedEventHandler l_Handler = PropertyChanged;
            if (null != l_Handler)
            {
                l_Handler(this, new PropertyChangedEventArgs(f_Prop_Name));
            }
        }

        #endregion
    }

    public class MyItem
    {
        public MyItem(string f_Name)
        {
            Name = f_Name;
        }

        public string Name {get;set;}
    }
}

и следующее окно:

<Window x:Class = "WpfApplication8.MainWindow"
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        Title = "MainWindow" Height = "350" Width = "525">
    <Grid>
        <ComboBox
            HorizontalAlignment = "Center"
            VerticalAlignment = "Top"
            ItemsSource = "{Binding Items}"
            SelectedItem = "{Binding Selected_Item}">

            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text = "{Binding Name}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>

        </ComboBox>
    </Grid>
</Window>

c_Disabled всегда верно.

Jammer 22.06.2018 10:20

Ваша проблема не ясна. Очевидно, что ваше условие if всегда верно. Может быть, если вы четко сформулируете свое требование, люди смогут подсказать вам, в чем вы ошиблись.

Swamy 22.06.2018 10:22

Установщик Selected_Item не может предотвратить изменение SelectedItem ComboBox, даже если он не установил свое поле поддержки. Пока привязка не переоценивается, ничего не происходит.

Clemens 22.06.2018 10:23

@Jammer Нет, это не всегда правда

Sir Rufo 22.06.2018 10:26

Я думаю, что вам нужны DependencyProperty и Coerce Value Callbacks для решения вашей проблемы. Пожалуйста, проверьте эту ссылку: stackoverflow.com/questions/30379687/…

Swamy 22.06.2018 10:29

Я хочу НЕ обновлять выбор из внешнего мира (то есть из представления, отключив назначение), однако даже если Selected_Item в модели не изменяется, View полностью игнорирует это и по-прежнему придерживается любого выбора, который пользователь делает из пользовательский интерфейс.

user1464603 22.06.2018 10:31

«Представление полностью игнорирует это» - конечно, потому что ваше предположение о том, как работают привязки, неверно.

Clemens 22.06.2018 10:32

@Clemens, спасибо, я подумал, что теперь это кусок документа, из которого я должен был сделать вывод, что мое «предположение о том, как работают привязки», неверно?

user1464603 22.06.2018 10:35

Вы предполагаете, что после того, как Binding установит значение исходного свойства, оно автоматически получит фактическое значение обратно из своего исходного свойства. Что заставляет вас думать так?

Clemens 22.06.2018 10:36

@Clemens, нет, я предполагаю, что это не работает, потому что я сказал [quote] я также пытался всегда вызывать OnPropertyChanged ("Selected_Item") [/ quote]. Это означает, что даже если я перезапущу обновление свойства, когда набор игнорируется, пользовательский интерфейс игнорирует его.

user1464603 22.06.2018 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
60
1

Ответы 1

Удалите c_Disabled = true; из метода контекста;

Другие вопросы по теме