Binding Combobox SelectedValue из привязанного значения в сетке UserControl - PullRequest
1 голос
/ 30 декабря 2011

Я провел последние два дня, пытаясь заставить это случиться, и я не могу понять, чего мне не хватает. У меня есть пользовательский элемент управления 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 со списком состояний из другого объекта, и поле со списком заполнено правильно. Однако я хочу, чтобы свойство StateID в объекте Clinic устанавливало то, что отображается в выпадающем списке, но я не могу понять, какими должны быть свойства ElementName и Path для SelectedValue.

Каков синтаксис для ElementName и Path в привязке для SelectedValue моего комбинированного списка?

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Ваш XAML сбивает с толку, отчасти потому, что вы долго пишете привязки, однако, если все работает, то я подозреваю, что вы просто пропускаете DataContext в вашей привязке Path

Вот пример

ViewModel:

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 родительской сетки - это модель представления. Дочерняя сетка получает свой DataContext, связанный с SelectedClinic, который является объектом Clinic. Это позволяет привязке для TextBox.Text и ComboBox.SelectedValue работать.

  • Чтобы связать ItemsSource ComboBox, я использую ElementName, чтобы указать привязку к объекту пользовательского интерфейса с именем SomePanel, а затем говорю ему связать с DataContext.States. Это означает, что окончательная привязка для ItemsSource указывает на SomePanel.DataContext.States.

1 голос
/ 30 декабря 2011

Если ваш DataContext настроен правильно, как вы утверждаете, просто удалите ElementName из привязки.Это используется для привязки к другому UIElement, и у вас нет ни одного UIElement с именем ClinicInfoRoot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...