これを実現するために過去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の構文は何ですか?
レイチェル、あなたの答えをありがとう。私のユーザコントロールに別のグリッドを追加することは、正しく理解すれば、あなたが示唆していることです。私はViewModelを使用していないので、なぜ私は別のグリッドを作成し、それを既にバインドしている状態のリストにバインドするべきかわかりません。 2番目のグリッドでDataContext = {Binding SelectedClinic}を使用している場合、そのページの後ろにそのデータをどのように表現できますか?私はパブリックプロパティを作成し、それに私のClinicオブジェクトを割り当てて、私のページのDataContextを背後に置くのではなく、xamlでのみ行うのですか? – MikeMalter
レイチェル、私はあなたが私の理解を助けようとしているものを得たと思う。基本的には、ViewModelには、ウィンドウにバインドする必要のあるオブジェクト、リスト、単一オブジェクトなどのオブジェクトが数多くあります。次に、コンボボックスで2つの異なるソースを指すことができるので、ItemsSourceとSelectedValueバインディングが機能します。以前はどこから来たものかを区別する方法はありませんでした。モデルを拡張するために、選択したオブジェクトといくつかのコンボボックスがある場合は、それらをすべて外部グリッドにバインドします。次に、すべての詳細プロパティを持つ選択されたオブジェクトが内側のグリッドにバインドされます。 – MikeMalter
@MikeMalterはい、それは大まかなアイデアです。外部グリッドは必ずしもグリッドである必要はありません。これは、別のPanel、Control、またはWindowオブジェクトさえできます。 ViewModelも本当に必要ありませんが、MVVMデザインパターンを使用するとWPFがより簡単に機能することがわかりました。重要な点は、SelectedValueをバインドできるように、ComboBoxのDataContextをClinicオブジェクトにする必要があり、RelativeSource Binding、StaticResourceなど、ItemsSourceを見つける場所を知っておく必要があります。 – Rachel