将WPF组合框项目源绑定到另一个.cs文件中的属性

时间:2018-09-11 16:34:47

标签: c# wpf xaml data-binding

我试图将组合框绑定到我在另一个文件中定义的属性。

组合框,位于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");
     }
}

打开OptionsWindow时出现错误:

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 :(得分:4)

您可以创建一个视图模型对象以在这两个窗口之间交换数据,并将其传递给两个窗口实例的DataContext。然后,绑定属性不需要任何相对源,只需在Path中设置包含列表的属性名称即可。 或者更好地看一下MVVM设计模式 https://blogs.msdn.microsoft.com/msgulfcommunity/2013/03/13/understanding-the-basics-of-mvvm-design-pattern/

创建一个视图模型类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}"/>

如果在MainWindow.xaml的绑定中使用InputDeviceNames,请确保将项目更改通知给视图。然后使用ObservableCollection<T>代替List<T>。 而且,如果要扩展视图模型以容纳其他值,请在MainViewModel类上实现INotifyPropertyChanged接口。

MVVM是用于UI开发的强大模式,因此,在稍加努力之后,您就可以以更少的努力获得更好的结果。

希望它对您有帮助。