Bbinding combobox внутри формы данных для просмотра свойства модели вне контекста формы данных

У меня есть два свойства в моей модели представления:

//Relationship has property ReasonForEndingId
private Relationship editRelationship;
public Relationship EditRelationship
{
    get
    {
        return editRelationship;
    }

    set
    {
        if (editRelationship != value)
        {
            editRelationship = value;
            RaisePropertyChanged(EditRelationshipChangedEventArgs);
        }
    }
}

//ReasonForLeaving has properties Reason & Id
private IList<ReasonForLeaving> reasonsComboList { get; set; }
public IList<ReasonForLeaving> ReasonsComboList
{
    get
    {
        return reasonsComboList;
    }

    private set
    {
        if (reasonsComboList != value)
        {
            reasonsComboList = value;
            RaisePropertyChanged(ReasonsComboListChangedEventArgs);
        }
    }
}

В моем xaml у меня есть следующее: (обратите внимание на привязку к форме данных и комбинированному списку)

<toolkit:DataForm x:Name="EditForm" CurrentItem="{Binding EditRelationship, Mode=TwoWay}">
    <toolkit:DataForm.EditTemplate>
    <DataTemplate>
            <StackPanel>
                <toolkit:DataField>
                    <ComboBox x:Name="EndReasonCombo" ItemsSource="{Binding ReasonsComboList}" DisplayMemberPath="Reason" SelectedValuePath="Id" SelectedValue="{Binding ReasonForEndingId, Mode=TwoWay}"/>
                </toolkit:DataField>

Итак, я пытаюсь привязать список, который существует в моей view-модели (текст данных для страницы). Тем не менее, контентом данных DataForm является EditRelationship. ReasonsComboList не существует в EditRelationship.

Как я могу связать комбинированный список так, чтобы он отображал список элементов, доступных в ReasonsComboList?

Спасибо за вашу помощь!

4 ответа

Вот что я сделал (проверено и работает):

Внутри DataForm это не будет работать (потому что это DataTemplate):

<ComboBox MinWidth="150" DisplayMemberPath="Name" Name="cbCompanies"
          SelectedItem="{Binding TODOCompany,Mode=TwoWay}" 
          ItemsSource="{Binding ElementName=control, Path=ParentModel.Companies}" />

Но вы можете сделать это вместо этого:

<ComboBox MinWidth="150" DisplayMemberPath="Name" Name="cbCompanies"
          SelectedItem="{Binding TODOCompany,Mode=TwoWay}" 
          Loaded="cbCompanies_Loaded"/>

Код позади:

private void cbCompanies_Loaded(object sender, RoutedEventArgs e)
{
    // set combobox items source from wherever you want
    (sender as ComboBox).ItemsSource = ParentModel.Companies;
}

Если вы установите свой datacontext, используя локатор таким образом

DataContext="{Binding FormName, Source={StaticResource Locator}}"

<ComboBox ItemsSource="{Binding FormName.ReasonsComboList, Source={StaticResource Locator}, Mode=OneWay}"
          DisplayMemberPath="Reason" SelectedValuePath="Id"
          SelectedValue="{Binding ReasonForEndingId, Mode=TwoWay}"/>

проверено и работает

Я не проверял это с вашим точным сценарием, но вы должны иметь возможность ссылаться на DataContext некоторого родительского элемента при связывании ItemsSource ComboBox. В основном используется привязка элемента к элементу Silverlight для фактического связывания с некоторым свойством в DataContext родительского контейнера вместо DataContext текущего элемента.

Например, если ваш главный ViewModel был DataContext элемента LayoutRoot, вы должны иметь возможность сделать что-то вроде этого:

<ComboBox x:Name="EndReasonCombo" ItemsSource="{Binding DataContext.ReasonsComboList, ElementName=LayoutRoot}" DisplayMemberPath="Reason" SelectedValuePath="Id" SelectedValue="{Binding ReasonForEndingId, Mode=TwoWay}"/>

Создание Silverlight DataContext Proxy для упрощения привязки данных во вложенных элементах управления

Отказ от ответственности: это может на самом деле не работать для DataForm, но подходит для той же проблемы при использовании DataGrid. но я помещаю это здесь как ответ, потому что это было интересное чтение и помогло мне понять некоторые вещи, когда я столкнулся с той же самой проблемой.

Другие вопросы по тегам