Вызов функции в родительском окне из дочернего окна - PullRequest
2 голосов
/ 13 января 2011

Я пытаюсь реализовать пользовательский диалог поиска в программе WPF. Родительское окно - это ListView, который привязан к наблюдаемой коллекции.

Я сделал новое окно с формой поиска, и оно инициализируется так:

searchForm sf = new searchForm(_QPCollection);
sf.Owner = this;
sf.Show();

и у меня есть эта функция, которую я пытаюсь вызвать (в окне Владелец):

public void selectIndex(int index)
{
    ListViewItem toSelect = listView1.Items[index] as ListViewItem;
    toSelect.Focus();
}

Затем в дочернем окне (searchForm) пытается вызвать selectIndex, например, так:

public void SearchJob_Click(object sender, RoutedEventArgs e)
{
    if (sJob.Text == "" || sJob.Text == null) { return; }
    for (int i = findCount; i < _QPCollectionSearch.Count; i++)
    {
        if (i == _QPCollectionSearch.Count - 1) { i = 0; }
        if (_QPCollectionSearch[i].jobNumAndFlow.IndexOf(sJob.Text) > -1)
        {
            findCount = i;
            Owner.selectIndex(i);
        }

    }
}

Я получаю сообщение об ошибке: System.Windows.Window не содержит определения для «selectIndex».

_QPCollection - это наблюдаемая коллекция, через которую будет проходить поиск. У меня работает логика поиска, но я не могу показывать Focus() индекс ListView в родительском окне.

Моей первой мыслью было создание общедоступной функции, к которой я мог бы передать индекс, и она бы сфокусировалась, но я не могу найти способ вызова функции из дочернего окна, которое находится в родительском окне. *

Я правильно подхожу к этому? Этот ответ , кажется, предназначен для WinForms, но я уверен, что есть способ получить доступ к Родительскому окну и его открытым функциям / свойствам в WPF.

Ответы [ 2 ]

7 голосов
/ 13 января 2011

Более понятный способ обработки этого сценария - ваш searchForm поднять событие. Родительское окно может прослушивать это событие и устанавливать фокус на собственном представлении списка:

public class searchForm 
{
    public event EventHandler<SearchEventArgs> SearchResultSelected = delegate { };
}

public class SearchEventArgs : EventArgs
{
    public int Index { get; set; }
}

searchForm sf = new searchForm(_QPCollection);
sf.SearchResultSelected += (s, e) => MyListView.SelectedIndex = e.Index;
4 голосов
/ 13 января 2011

Если вы установите Owner, как вы сделали, вы сможете вызывать публичные методы внутри диалога через (Owner as MyWindowDerivative).Method() (если владелец имеет тип Window), что именно мешает вам сделать это?

Изменить: Если вы собираетесь идти по этому маршруту, убедитесь, что Owner всегда имеет тип MyWindowDerivative, например. перезаписав свойство-владельца, также предотвратите использование конструкторов без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...