Почему текст данных не обновляет sh, когда один наблюдаемый получает значения по другой наблюдаемой ссылке? - PullRequest
0 голосов
/ 20 июня 2020

сначала я собираюсь объяснить, что я пытаюсь сделать. У меня есть 3 объекта, Кампания, Сценарий и Приключение, поэтому у меня есть 3 наблюдаемые коллекции,

Observable Campaigns
Observable Scenarios
Observable Adventures

и одно поле со списком для каждого наблюдаемого.

Значение объектов хранится в глобальном переменная, пользовательская сессия. В этом сеансе я узнал о кампаниях, сценариях ios и приключениях в любом окне.

Итак, когда вы вводите основной windows, приложение считывает сеанс, а три наблюдаемых объекта получают ссылки.

Observable Campaigns = Usersession.CampaignList
Observable Scenarios = Campaign[selecteditem].ScenarioList
Observable Adventures = Scenario[selecteditem].AdventureList

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

Observable Campaigns = Usersession.CampaignList
Datacontext = this;

Затем когда вы выбираете первое поле со списком, чтобы узнать, из какой кампании мне нужно получить сценарий ios, если мне нравится:

Observable Scenarios = CampaignCombobox[selecteditem].ScenarioList

Наблюдаемый, получает значение, но текст данных не обновляется, поэтому поле со списком не имеет элементов, и, поскольку я делаю это в selectionchange, если я попытаюсь сделать:

datacontext = null;
datacontext = this;

он сойдет с ума

И самое худшее, и то, что я не могу понять, когда У меня есть:

for each()...
Scenarios.add(item)

нет проблем, и текст данных работает правильно.

Что я могу сделать?

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

Я не использую MVVM, код.

private ObservableCollection<Campana> campanas = new ObservableCollection<Campana>();
        private ObservableCollection<EscenarioCampana> escenarios = new ObservableCollection<EscenarioCampana>();
        private ObservableCollection<Aventura> aventuras = new ObservableCollection<Aventura>();
        private List<Style> estilosbase = new List<Style>();
        private List<Style> estilosactivados = new List<Style>();
        private Campana campanaseleccionada;
        private EscenarioCampana escenarioseleccionado = null;

        public EscenarioCampana EscenarioSeleccionado
        {
            get { return escenarioseleccionado; }
            set { escenarioseleccionado = value; }
        }
        public Campana CampanaSeleccionada
        {
            get { return campanaseleccionada; }
            set { campanaseleccionada = value; }
        }
        public ObservableCollection<Aventura> Aventuras
        {
            get { return aventuras; }
            set { aventuras = value; }
        }
        public ObservableCollection<EscenarioCampana> Escenarios
        {
            get { return escenarios; }
            set { escenarios = value; }
        }
        public ObservableCollection<Campana> Campanas {
            get { return campanas; }
            set { campanas = value; }
        }

        //se inicializan los componentes, se define el idioma, creamos una lista con todas las campañas
        //luego recorremos esta lista, para añadirlas todas a un observable que es el que usaremos
        public menuPrincipal()
        {
            InitializeComponent();
            ConfiguracionPagina.DefinirIdioma(this, "MainMenu");

            this.campanas = RecursosAplicacion.SesionUsuario.ListCampaigns;          
            DataContext = this;

            DefinirEstilos();
        }

        private void SeleccionarCampana()
        {
            ComprobarImagen();

            this.CampanaSeleccionada = (Campana)this.campaignComboBox.SelectedItem;

            //Habilita el botón de borrado si no se ha seleccionado una de las predeterminadas
            if (campaignComboBox.SelectedIndex > 1)
            {
                this.BorrarCampana.IsEnabled = true;
            }
            else
            {
                this.BorrarCampana.IsEnabled = false;
            }

            //Limpia la lista de escenarios y los añade al observable (para la primera vez que estara vacio)
            //this.escenarios.Clear();
            foreach (EscenarioCampana item in CampanaSeleccionada.ListaEscenarios)
            {
                this.escenarios.Add(item);
            }
            //this.Escenarios = campanaseleccionada.ListaEscenarios;
            //DataContext = this;
            //this.EscenarioComboBox.ItemsSource = this.escenarios;

            //indica que el stackpanel escenario sea visible
            this.StackPanelEscenario.Visibility = Visibility.Visible;
            if (this.EscenarioComboBox.HasItems)
                this.EscenarioComboBox.SelectedIndex = 0;

            //Limpiamos la lista de aventuras si no hay escenarios
            if (!EscenarioComboBox.HasItems)
            this.aventuras.Clear();

        }
...