2011-07-14 15 views
0

私は、コンボボックスを持つConfigSetupというダイアログボックスを持っています。データコンテキストはviewModelに設定されていますが、私のコンボボックスのItemSourceをメインウィンドウ(MainWindow)のプロパティにバインドする必要があります。 ViewModelには、ダイアログボックスのコードここコンボボックスItemSourceをDataContextにないプロパティにバインドする方法は?

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

     } 
    } 

でセットアップがある。ここ

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"); } 
     } 

にバインドするためにSelectedValueのプロパティを持つVM内のコードだとXAMLだのはここ

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

    } 

ですコンボボックス

<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を使用しようとした

をいただければ幸いです。

答えて

0

2つの方法があります。 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を使用することです。

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

感謝をブログ投稿する - なぜ私はそれを静的にする必要がありますか?方法2の場合 - 新しいリソースが追加のMainWindowオブジェクトを作成するのか、それとも既存のインスタンスへの参照ですか。 – Pat

+0

私が知る限り、これまでのところ、既存のインスタンスをXAMLにリンクする方法はありません。だから、私はそれの参照を取得する '静的'を言及した。 –

0

ダイアログウィンドウはどのように起動されますか? window.ShowDialog()を介して起動されている場合は、ダイアログウィンドウのコンストラクタのパラメータとしてバインドする必要があるオブジェクトを渡すことができます。コンストラクタは、XAMLコードをバインドできる内部プロパティにそのコンストラクタを割り当てます。

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

参照方法1の場合は、http://kostylizm.blogspot.ru/2014/04/wpf-combobox-itemssource-bind-to-parent.html

関連する問題