如何将组合框ItemSource绑定到不在DataContext中的属性

本文关键字:DataContext 属性 绑定 组合 ItemSource | 更新日期: 2023-09-27 18:02:02

我有一个对话框,ConfigSetup有一个组合框。它的数据上下文被设置为viewModel,但是我需要将我的Combobox的ItemSource绑定到主窗口(MainWindow)中的属性。

   public partial class MainWindow : Window, INotifyPropertyChanged
   {
   ...
        public CfgData.TMicMode[] MicModeOptions
        {
            get
            {
                return (CfgData.TMicMode[])System.Enum.GetValues(typeof(CfgData.TMicMode));
            }
        }
   }

这是在对话框代码

中设置viewModel的地方
    public partial class ConfigSetup : Window, INotifyPropertyChanged
    {
        private ConfigSetupVM vm_ = null;
        public ConfigSetup(CfgData cfgData)
        {
            vm_ = new ConfigSetupVM(cfgData);
            InitializeComponent();
            vm_.RequestClose += delegate
            {
                Close();
            };

            DataContext = vm_;
        }
   }

下面是VM中有selectedvalue属性要绑定到

的代码
   class ConfigSetupVM : ViewModelBase, IDataErrorInfo
    {
    ...
         /// <summary> 
        /// C-5000's microphone mode.
        /// </summary>/
        public CfgData.TMicMode MicMode
        {
            get { return model_.MicMode; }
            set { model_.MicMode = value; NotifyPropertyChanged("MicMode"); }
        }

这是带有组合框

的XAML
<Window x:Class="RpP25.ConfigSetup"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:RpWin="clr-namespace:RpP25"
    Title="FCT Configuration" 
    Width="300"
    SizeToContent="Height"
    ResizeMode="NoResize"
    WindowStartupLocation="CenterOwner" WindowStyle="ToolWindow"
    FocusManager.FocusedElement="{Binding ElementName=name}"
    Background="AliceBlue" >
    <Window.Resources>
    ...
    </Window.Resources>
    ...
    <ComboBox Grid.Row="6" Grid.Column="1"
              HorizontalAlignment="Right" MinWidth="75"
              ItemsSource="{Binding RpWin:MainWindow.MicModeOptions, Mode=OneWay}"
              SelectedValue="{Binding RpWin:MainWindow.MicMode, Mode=TwoWay, TargetNullValue=Not Selected,
                                      ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" />

...

我知道我错过了绑定的一些基本的东西,但是我这辈子都不知道如何绑定到数据上下文之外的东西。

我已经尝试使用FindAncestor…没有成功

如何将组合框ItemSource绑定到不在DataContext中的属性

有两种可能的方法。一个是,如下面的代码所示,使用static成员。

<ComboBox ItemsSource="{Binding Source={x:Static local:MainWindow.MicModeOptions} , Mode=OneWay}"/>
public partial class MainWindow : Window, INotifyPropertyChanged
{
    public **static** CfgData.TMicMode[] MicModeOptions
    {
    }
}

另一种是在XAML中使用Resources,其中目标类(代码中的MainWindow)必须获得默认构造函数(无参数)。

<Grid>
    <Grid.Resources>
        <local:MainWindow x:Key="mainWindow"/>
    </Grid.Resources>
    <ComboBox ItemsSource="{Binding Source={StaticResource mainWindow}, Path=MicModeOptions , Mode=OneWay}"/>
</Grid>

如何启动对话框窗口?如果它是通过window. showdialog()启动的,那么你可以将需要绑定的必要对象作为参数传递给对话框窗口的构造函数。然后构造函数将其分配给一个内部属性,您的XAML代码可以绑定到该属性。

试试这个方法,简单又干净。

<!-- In user countrol resources -->
    <UserControl.Resources>
        <CollectionViewSource Source="{Binding Currencies}" x:Key="Currencies"/>
    </UserControl.Resources>
<!-- below inside ex. DataGrid -->
  <ComboBox ItemsSource="{Binding Source={StaticResource Currencies}}" IsSynchronizedWithCurrentItem="False"
            DisplayMemberPath="IsoCode"
            SelectedItem="{Binding BaseCurrency}"/>
<!-- IsSynchronizedWithCurrentItem="False" is important, otherwise ComboBoxes will select same item for each child viewmodel -->

对blogpost的引用http://kostylizm.blogspot.ru/2014/04/wpf-combobox-itemssource-bind-to-parent.html