如何将Combobox ItemSsource绑定到不在DataContext中的属性?

时间:2011-07-14 20:08:15

标签: c# wpf binding combobox datacontext

我有一个对话框,ConfigSetup有一个Combobox。它的数据上下文设置为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}" />


...

我知道我缺少Binding的基本功能,但是我不知道如何绑定到datacontext之外的东西。

我尝试使用FindAncestor ......但没有成功

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

有两种可能的方法。下面的代码就是使用静态成员。

<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>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试这种方法,简单易用。

<!-- 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 -->

参考博客http://kostylizm.blogspot.ru/2014/04/wpf-combobox-itemssource-bind-to-parent.html