2014-04-04 15 views
8

Hy,WPF Ottieni finestra principale

Nel mio file MainWindow.xaml.cs ho creato un getter per ottenere il riferimento alla mia listbox.

public ListBox LoggerList 
{ 
    get { return Logger; } 
}  

Ora voglio accedere a LoggerList da una classe normale ma non lavoro. Ho provato quanto segue:

MainWindow parentWindow = Window.GetWindow(this) as MainWindow; 
object selectedItem = parentWindow.LoggerList; 

Ma questo funziona solo in un file * xaml.cs e non in un normale file di cs *.

migliori saluti

+0

Un ListBox WPF è collegabile, invece di avere una proprietà nella tua listbox dovresti avere una proprietà per la tua fonte contenente i tuoi articoli, e legarli alla listbox (LoggerList.ItemSource = myList; in questo modo sarai in grado di vincolare il tuo Classi a più finestre e quindi sarete in grado di usarli.Il modo in cui lo state gestendo ora non è il modo giusto.Vedete un'occhiata agli esempi WPF di base e vincolanti – woutervs

+3

Provate questo: 'Finestra parentWindow = Application.Current. MainWindow'. –

+0

Hy, provato con Window parentWindow = Application.Current.MainWindow, ma non riesco a ottenere LoggerList. – user2644964

risposta

13
Ci

sono un certo numero di modi per accedere Window s in WPF. Se si dispone di più aperta, allora si può scorrere attraverso di loro in questo modo:

foreach (Window window in Application.Current.Windows) window.Close(); 

Se si ha un particolare tipo di costume Window, è possibile utilizzare questo:

foreach (Window window in Application.Current.Windows.OfType<YourCustomWindow>()) 
    ((YourCustomWindow)window).DoSomething(); 

Se sono solo dopo un riferimento al MainWindow, allora si può semplicemente utilizzare questo:

Window mainWindow = Application.Current.MainWindow; 

Tuttavia, con questo metodo, c'è una possibilità che tornerà null. In questo caso, assicurarsi di aver impostato il MainWindow a questa proprietà in esso del costruttore:

// From inside MainWindow.xaml.cs 
Application.Current.MainWindow = this; 

Va notato tuttavia, che @woutervs è corretto ... si dovrebbe non essere l'accesso ai controlli dell'interfaccia utente da Window s in classi di biblioteca. Dovresti davvero associare le raccolte di dati allo ListBox.ItemsSource e quindi manipolare la raccolta di dati.


UPDATE >>

Non so il motivo per cui l'oggetto è Application.Currentnull ... potrebbe essere perché hai caricato la libreria di classi in un diverso AppDomain. Ad ogni modo, penso che ti manchi il quadro generale. Non c'è davvero alcuna ragione per cui una classe di libreria di classe dovrebbe avere bisogno di un riferimento al principale Window.

Se è necessario eseguire alcuni lavori sulla raccolta dati, è sufficiente passare la raccolta dati dal codice sottostante o dal modello di visualizzazione. Una volta completato il lavoro, è sufficiente restituirlo all'interfaccia utente in cui si ha accesso allo ListBox e/o alla raccolta dati associata alla proprietà ItemsSource.

+0

Hy, provato con Window parentWindow = Application.Current.MainWindow. Ma non riesco a ottenere LoggerList. \t Ho bisogno di questo perché voglio eseguire lo scorrimento automatico della casella di riepilogo dopo aver aggiunto un elemento con: LoggerList.ScrollIntoView (LoggerList.Items [LoggerList.Items.Count - 1]); – user2644964

+0

Per favore leggi di nuovo il mio penultimo paragrafo. – Sheridan

+0

Hy, ho anche impostato MainWindow su questa proprietà nel suo costruttore. Sì, lego la collezione osservabile alla lista ma la lista non scorre automaticamente con la rilegatura. Intendevi quello o qualcos'altro? – user2644964

Problemi correlati