从UserControl网格中的绑定值绑定Combobox SelectedValue
我花了最后两天试图做到这一点,我无法弄清楚我错过了什么。 我有一个网格WPF用户控件,并在该网格内的文本框和组合框。 网格的DataContext在C#代码中用一个对象设置,并且我已经能够双向绑定我的文本框到网格的DataContext对象。 这里是一些示例代码。 进入ClinicInfoRoot的对象是我的Clinic对象,它的一个属性是StateID(这很重要)
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();
}
}
现在为xaml:
<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>
我已经能够将文本框与Clinic对象的相应属性绑定,但问题出在我的状态组合框中。 我已将ItemsSource与另一个对象的状态列表绑定,并且组合框正确填充。 但是,我希望Clinic对象中的StateID属性设置组合框中显示的内容,但我无法确定ElementName和Path属性应该用于SelectedValue。
在我的组合框的SelectedValue的绑定中,ElementName和Path的语法是什么?
您的XAML令人困惑,部分原因是您正在编写绑定很长的路,但是如果一切正常,那么我怀疑您只是在绑定Path
缺少DataContext
这是一个例子
视图模型:
List<State> States;
Clinic SelectedClinic;
State
有两个属性
string Abbrev
int StateId
Clinic
有两个属性
string Name
int StateId
XAML:
<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。 子Grid获取它的DataContext绑定到SelectedClinic,它是诊所对象。 这允许TextBox.Text
和ComboBox.SelectedValue
的绑定工作。
为了绑定ComboBox的ItemsSource,我使用ElementName
将绑定指向名为SomePanel
的UI对象,然后告诉它绑定到DataContext.States
。 这意味着ItemsSource的最终绑定指向SomePanel.DataContext.States
。
如果你的DataContext的设置正确,那么只需从绑定中移除ElementName
。 这用于绑定到另一个UIElement,并且您没有任何称为ClinicInfoRoot
UIElements。
上一篇: Binding Combobox SelectedValue from bound value in UserControl grid