Как связать Combobox ItemSource со свойством, отсутствующим в DataContext? - PullRequest
0 голосов
/ 15 июля 2011

У меня есть диалоговое окно ConfigSetup, в котором есть поле со списком. Его контекст данных установлен на viewModel, но мне нужно привязать ItemSource моего Combobox к свойству в главном окне (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_;

        }
   }

Вот код в виртуальной машине, который имеет свойство 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 ... безуспешно

Ваша помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Как открывается диалоговое окно? Если он запускается через window.ShowDialog (), то вы можете передать необходимый объект, с которым вам необходимо связать, в качестве параметра конструктору вашего диалогового окна. Затем конструктор назначает его внутреннему свойству, к которому может привязываться ваш код XAML.

0 голосов
/ 14 апреля 2014

Попробуйте этот метод, легко и чисто.

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

0 голосов
/ 15 июля 2011

Есть два возможных пути. Один из них, как показано в коде ниже, использует статический член.

<ComboBox ItemsSource="{Binding Source={x:Static local:MainWindow.MicModeOptions} , Mode=OneWay}"/>

public partial class MainWindow : Window, INotifyPropertyChanged
{

    public **static** CfgData.TMicMode[] MicModeOptions
    {
    }
}

Другой - использовать Resources в XAML, где целевой класс (MainWindow в вашем коде) должен получить конструктор по умолчанию (без параметров).

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