Привязать источник элементов списков WPF к свойству в другом файле .cs - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь связать комбинированный список со свойством, которое я определил в другом файле.

Combobox, в OptionsWindow.xaml:

<ComboBox x:Name="InputDevicesComboBox"
          VerticalAlignment="Top"
          Text="Please Select Input Device"
          ItemsSource="{Binding InputDeviceNames, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type SIPBandVoIPClient:MainWindow}}}"/>

Имущество, в MainWindow.xaml.cs:

private List<string> _inputDeviceNames;
public List<string> InputDeviceNames
{
     get => _inputDeviceNames;
     private set
     {
          _inputDeviceNames = value;
          OnPropertyChanged("InputDeviceNames");
     }
}

Ошибка при открытии окна параметров:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='SIPBandVoIPClient.MainWindow', AncestorLevel='1''. BindingExpression:Path=InputDeviceNames; DataItem=null; target element is 'ComboBox' (Name='InputDevicesComboBox'); target property is 'ItemsSource' (type 'IEnumerable')

Я понимаю, что по этому вопросу довольно много вопросов, но я не очень хорошо понимаю привязки WPF и не могу заставить их работать ...

Я создал эту привязку, используя встроенную привязку в Visual Studio, поэтому решил, что она будет работать. После некоторого поиска, я думаю, проблема в том, что свойство находится в другом файле, или оно не является частью визуального дерева (?).

У меня есть привязка со свойством, определенным в MainWindow.xaml.cs и привязанным в MainWindow.xaml, который работает отлично, поэтому я думаю, что это из-за того, что находится в другом файле.

Спасибо за помощь.

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете создать объект модели представления для обмена данными между этими двумя окнами и передать его в DataContext обоих экземпляров окна.Тогда вам не нужен какой-либо относительный источник в атрибуте связывания, а просто в пути укажите имя свойства, содержащее ваш список.Или лучше взгляните на шаблон проектирования MVVM https://blogs.msdn.microsoft.com/msgulfcommunity/2013/03/13/understanding-the-basics-of-mvvm-design-pattern/

Создайте класс View Model mainViewModel.cs:

class MainViewModel {
    List<string> InputDeviceNames { get; private set; }
    public MainViewModel() {
        InputDeviceNames = new List<string>();
    }
}

Затем используйте его в своем классе MainWindow.xaml.cs:

private MainViewModel _viewModel;
public MainWindow() {
    _viewModel = new MainViewModel();
    DataContext = _viewModel;
    // anywhere in code you can use your _viewModel to exchange data
}
public OpenOptionsWindowCode() {
    var options = new OptionsWindow();
    options.DataContext = _viewModel;
    options.Show();
}

В вашем OptionsWindow.xaml:

<ComboBox x:Name="InputDevicesComboBox"
      VerticalAlignment="Top"
      Text="Please Select Input Device"
      ItemsSource="{Binding InputDeviceNames}"/>

Если вы используете InputDeviceNames в связывании в MainWindow.xaml, обязательно уведомите представление об изменениях элементов.Затем используйте ObservableCollection<T> вместо List<T>.И если вы расширите свою модель представления, чтобы она содержала другие значения, реализуйте интерфейс INotifyPropertyChanged в классе MainViewModel.

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

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

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