2011-12-29 6 views
1

これを実現するために過去2日間を費やしましたが、私は何が欠けているのかわかりません。グリッドを持つWPFユーザーコントロールがあり、そのグリッド内にテキストボックスとコンボボックスがあります。グリッドのDataContextはC#コードでオブジェクトで設定されており、グリッドのDataContextオブジェクトにテキストボックスを双方向でバインドすることができました。ここにいくつかのサンプルコードがあります。私がすることができたUserControlグリッドのバインドされた値からCombined SelectedValueをバインドします

<Grid Name="ClinicInfoRoot" 
    Margin="0,0,10,10" 
    Validation.Error="ClinicInfoRoot_Error"> 

<TextBox Margin="82,28,0,0" 
     Name="txtName" 
     VerticalAlignment="Top" 
     HorizontalAlignment="Left" 
     Width="82" > 

    <TextBox.Text> 
     <Binding Path="Name" 
       Mode="TwoWay" 
       ValidatesOnDataErrors="True" 
       ValidatesOnExceptions="True" 
       NotifyOnValidationError="True" 
       UpdateSourceTrigger="PropertyChanged"></Binding> 
    </TextBox.Text> 
</TextBox> 

<ComboBox HorizontalAlignment="Left" 
      Margin="281,141,0,0" 
      Name="cbState" 
      VerticalAlignment="Top" 
      Width="73" 
      ItemsSource="{Binding Mode=OneWay}" 
      DisplayMemberPath="Abbrev" 
      SelectedValuePath="StateID" > 
    <ComboBox.SelectedValue> 
     <Binding ElementName="ClinicInfoRoot" 
       Path="Clinic.StateID" 
       Mode="TwoWay" 
       ValidatesOnDataErrors="True" 
       ValidatesOnExceptions="True" 
       NotifyOnValidationError="True" 
       UpdateSourceTrigger="PropertyChanged"></Binding> 
    </ComboBox.SelectedValue> 
</ComboBox> 

:ClinicInfoRootに起こっているオブジェクトは、私のクリニックオブジェクトとそれのプロパティの1つのXAMLのための今すぐ

private void Events_ClinicSelected(object sender, ClinicSelectedEventArgs e) 
{ 
    if (!DesignerProperties.GetIsInDesignMode(this)) 
    { 
     // Get the current logged in user object from arguments and set local 
     this.CurrentLoggedInPDUser = e.CurrentLoggedInPDUser; 

     // Bind the patient object to the window grid data context 
     this.ClinicInfoRoot.DataContext = e.Clinic; 

     // Set the mode and call mode manager 
     this.SetMode(Mode.View); 
     this.ModeManager(); 
    } 
} 

(現時点では重要です)STATEIDですClinicオブジェクトの適切なプロパティでテキストボックスをバインドしますが、問題は自分のStateコンボボックスにあります。 ItemsSourceを別のオブジェクトの状態のリストでバインドして、コンボボックスが正しく塗りつぶされました。しかし、私は、コンボボックスに表示されているものを設定するClinicオブジェクトのStateIDプロパティが必要ですが、SelectedValueのElementNameプロパティとPathプロパティを理解することはできません。

私のコンボボックスのSelectedValueのバインディングのElementNameとPathの構文は何ですか?

答えて

2

あなたのXAMLは、私はあなたがちょうどあなたの結合Path

DataContextここ

ViewModelには、一例だが欠落している疑いがあるすべてのものが動作しているしかし、もし、あなたがバインディングに長い道のりを書いている一因で、混乱しています:Stateは二つの特性

を持って

List<State> States; 
Clinic SelectedClinic; 

ここで注意すべき

<Grid x:Name="SomePanel" DataContext="{Binding MyViewModel}"> 

    <Grid DataContext="{Binding SelectedClinic}"> 

     <TextBox Text="{Binding Name}" /> 

     <ComboBox ItemsSource="{Binding ElementName=SomePanel, Path=DataContext.States}" 
        DisplayMemberPath="Abbrev" 
        SelectedValuePath="StateID" 
        SelectedValue="{Binding StateId}" /> 
    </Grid> 
</Grid> 

いくつ

  • 親グリッドのDataContextのは、ViewModelにある:210

    そしてClinic 2つのプロパティ

    string Name 
    int StateId 
    

    XAMLを持っています。子グリッドは、ClinicオブジェクトであるSelectedClinicにバインドされたDataContextを取得します。これにより、TextBox.TextComboBox.SelectedValueのバインドが可能になります。コンボボックスののItemsSourceをバインドする

  • 、私はSomePanelという名前のUIオブジェクトへの結合を指すようElementNameを使用して、その後、DataContext.Statesにバインドするために、それを言っています。これは、ItemsSourceの最終バインディングがSomePanel.DataContext.Statesを指していることを意味します。

+0

レイチェル、あなたの答えをありがとう。私のユーザコントロールに別のグリッドを追加することは、正しく理解すれば、あなたが示唆していることです。私はViewModelを使用していないので、なぜ私は別のグリッドを作成し、それを既にバインドしている状態のリストにバインドするべきかわかりません。 2番目のグリッドでDataContext = {Binding SelectedClinic}を使用している場合、そのページの後ろにそのデータをどのように表現できますか?私はパブリックプロパティを作成し、それに私のClinicオブジェクトを割り当てて、私のページのDataContextを背後に置くのではなく、xamlでのみ行うのですか? – MikeMalter

+0

レイチェル、私はあなたが私の理解を助けようとしているものを得たと思う。基本的には、ViewModelには、ウィンドウにバインドする必要のあるオブジェクト、リスト、単一オブジェクトなどのオブジェクトが数多くあります。次に、コンボボックスで2つの異なるソースを指すことができるので、ItemsSourceとSelectedValueバインディングが機能します。以前はどこから来たものかを区別する方法はありませんでした。モデルを拡張するために、選択したオブジェクトといくつかのコンボボックスがある場合は、それらをすべて外部グリッドにバインドします。次に、すべての詳細プロパティを持つ選択されたオブジェクトが内側のグリッドにバインドされます。 – MikeMalter

+0

@MikeMalterはい、それは大まかなアイデアです。外部グリッドは必ずしもグリッドである必要はありません。これは、別のPanel、Control、またはWindowオブジェクトさえできます。 ViewModelも本当に必要ありませんが、MVVMデザインパターンを使用するとWPFがより簡単に機能することがわかりました。重要な点は、SelectedValueをバインドできるように、ComboBoxのDataContextをClinicオブジェクトにする必要があり、RelativeSource Binding、StaticResourceなど、ItemsSourceを見つける場所を知っておく必要があります。 – Rachel

1

あなたが主張するようにDataContextを正しく設定している場合は、バインディングからElementNameを削除するだけです。これは別のUIElementへのバインドに使用され、ClinicInfoRootというUIElementsはありません。

+0

お返事ありがとうございました。実際には、SelectedValue BindingタグのElementNameプロパティを削除しようとしましたが、それでも正しい状態は表示されません。グリッドのDataContextを設定した直後にSelectedValueを明示的に設定すると、正しい状態が表示されます。したがってStateIDの値は良好です。私はそれを縛ることができません。他の考え? – MikeMalter

関連する問題