Как я могу заставить диалоговое окно возвращать выбранный элемент из списка?

Как я могу заставить диалоговое окно , которое принимает в свою модель представления список типа IEnumerable<string> и отображает его в ListBox'e, возвратить выбранный элемент переменной типа string либо индекс элемента в IEnumerable? В данном примере я попытался решить проблему передавая ссылку на stringпеременную по цепочке:

внешний код -> код окна -> модель представления

Внешний код:

               //Строковая переменная, которая хранит ссылку на выбранный элемент списка
               string SelectedName = string.Empty;
               //Создаем конструктор окна, передаем в конструктор список и переменную с выбранным элементом
               Window_ListPicker windowCourt = new Window_ListPicker(Statics.CourtNames, ref SelectedName);
               windowCourt.ShowDialog();
               if(SelectedName != string.Empty)
               {
               //Обработка результата
               }
               windowCourt.Close();

Окно Window_ListPicker:

public partial class Window_ListPicker : Window
{
    public Window_ListPicker(IEnumerable<string> sourceList, ref string resultProperty)
    {
        ViewModelListPicker VM = new ViewModelListPicker(ref resultProperty);
        VM.SourceList = sourceList;
        VM.HideAction = new Action(this.Hide);
        DataContext = VM;
        InitializeComponent();
    }
}

Код модели представления ViewModelListPicker:

class ViewModelListPicker : INotifyPropertyChanged
{
    public ViewModelListPicker(ref string selectedItem)
    {
        this.SelectedItem = selectedItem;
    }
    public IEnumerable<string> SourceList { get; set; }

    private string selectedItem;
    public string SelectedItem
    {
        get { return selectedItem; }
        set
        {
            if (value != string.Empty)
            {
                selectedItem = value;
                OnPropertyChanged("SelectedItem");
                HideWindow.Execute(null);
            }
        }
    }

    public Action HideAction { get; set; }


    private RelayCommand hideWindow;
    public RelayCommand HideWindow
    {
        get
        {
            return hideWindow ?? (hideWindow = new RelayCommand(obj => HideAction()));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string prop = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
}

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


Ответы (0 шт):