【问题标题】:How to bind a Combobox ItemSource to a Property not in the DataContext?如何将 Combobox ItemSource 绑定到不在 DataContext 中的属性?
【发布时间】:2011-07-14 20:08:14
【问题描述】:

我有一个对话框,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}" />


...

我知道我缺少 Binding 的一些基本内容,但我终其一生都无法弄清楚如何绑定到数据上下文之外的东西。

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

您的帮助将不胜感激。

【问题讨论】:

    标签: c# wpf binding combobox datacontext


    【解决方案1】:

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

    <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 - 为什么我必须将其设为静态?对于方法 2 - 新资源是创建额外的 MainWindow 对象,还是对现有实例的引用?
    • 据我所知,目前还没有将现有实例链接到 XAML 的方法。所以,我提到了static 以获得它的参考。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 2011-03-06
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多