сначала я собираюсь объяснить, что я пытаюсь сделать. У меня есть 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();
}