我试图将组合框绑定到我在另一个文件中定义的属性。
组合框,位于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中,该属性运行良好,因此我认为这是由于位于其他文件中。
感谢您的帮助。
答案 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开发的强大模式,因此,在稍加努力之后,您就可以以更少的努力获得更好的结果。
希望它对您有帮助。