Bbinding combobox внутри формы данных для просмотра свойства модели вне контекста формы данных - PullRequest
1 голос
/ 11 июня 2010

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

//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>

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

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

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

Ответы [ 4 ]

2 голосов
/ 14 июля 2010

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

В 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;
}
1 голос
/ 01 мая 2011

, если вы установили свой текст данных с помощью локатора таким образом

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}"/>

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

0 голосов
/ 14 июля 2010

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

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

0 голосов
/ 11 июня 2010

Я не проверял это с вашим точным сценарием, но вы должны иметь возможность ссылаться на 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}"/>
...