Вызов метода из другой проблемы окна (класса) - PullRequest
0 голосов
/ 10 января 2010

В коде файла основного окна приложения WPF у меня есть метод, запрашивающий базу данных с помощью LINQ to SQL и записывающий результаты в ObservableCollection:

    public void GetStateByDate(string shcode)
    {
        MydbDataContext contextSts = new MydbDataContext();
        _ShAvaQuCollection.Clear();

        var sts = from p in contextSts.SAties where p.ShID == shcode select p;

        foreach (var p in sts)
            _ShAvaQuCollection.Add(new ShAvaQu
            {
                ShCode = p.ShID,
                SiID = p.SiID,
                PrCat = p.PrCat
            });
    }

Когда я вызываю этот метод из того же кода за файлом (в том же окне), все в порядке.

Если я вызываю этот метод из другого окна, используя экземпляр главного окна, ObservableCollection остается пустым .:

SWindow sw = new SWindow();
sw.GetStateByDate(stringpar);

В чем причина этого? В этом случае метод создает еще один экземпляр ObservableCollection?

(я вижу в отладчике, что sw._ShAvaQuCollection содержит значения. Не является ли sw._ShAvaQuCollection тем же экземпляром коллекции, что и _ShAvaQuCollection? Если да, как его можно разрешить?)

Отредактировано (добавлено)

ObservableCollection объявлена ​​так:

    ObservableCollection<ShAvaQu> _ShAvaQuCollection =
            new ObservableCollection<ShAvaQu>();

    public ObservableCollection<ShAvaQu> ShAvaQuCollection
    { get { return _ShAvaQuCollection; } }

    public class ShAvaQu
    {
        public string ShCode { get; set; }
        public string SiID { get; set; }
        public int PrCat { get; set; }
    }

Я вызываю метод из окна, где другая коллекция ShQuCollection отображается через ListView. В обработчике событий SelectionChanged я принимаю аргумент для запроса этой базы данных:

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {           
        SWindow sw = new SWindow();         
        string str = sw.ShQuCollection[ShSelList.SelectedIndex].ShCode;
        sw.GetStateByDate(str);
        Close();
    }
}

1 Ответ

2 голосов
/ 10 января 2010

1) Самое главное, вы не должны вызывать логику БД из ваших окон / форм. Вы должны абстрагировать это в другой класс. Тогда ваш метод может вернуть наблюдаемую коллекцию.

Однако в вашем случае я предполагаю, что вы пытаетесь использовать вторичную форму для перезагрузки / загрузки коллекции, и вы хотите, чтобы она использовалась в вашей основной форме. Проблема в том, что вы создаете новый экземпляр формы, поэтому ваша коллекция заполняется, но не в основной форме, а в ее копии.

Есть несколько способов обойти это.

1) Сделайте метод статичным, а наблюдаемую коллекцию - статической, чтобы он обновлял один экземпляр.

2) Передайте дескриптор экземпляра вашей первичной формы во вторичную форму, чтобы вы могли повторно использовать экземпляр, который у вас уже есть. Это было бы предпочтительным, чтобы не создавать новые экземпляры повсюду.

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

ОБНОВЛЕНИЕ: Вот несколько примеров кода. В основном, есть много способов передать ссылку.

Вы можете сделать это так с помощью конструктора:

// This is the constructor for your second window
private Window _parentHandle;

public SecondWindow(Window obj)
{
    this._parentHandle = obj;
}

Тогда из вашей основной формы, в которой есть метод, вы бы открыли это окно следующим образом.

SecondWindow w = new SecondWindow(this);
w.Show();

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

Другим способом является использование общедоступного метода Setter во втором окне.

public Window ParentContext
{
   get { return this._parentHandle; }
   set { this._parentHandle = value; }
}

Тогда вы можете создать свой экземпляр формы следующим образом:

SecondWindow w = new SecondWindow();  // so just like normal
w.ParentContext = this; // set the instance to the calling form
w.Show();

Это основы. Этот тип сценария работает практически в любом сценарии, где вам нужно передать ссылку.

Надеюсь, это поможет.

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