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}"/>
Отказ от ответственности: это может на самом деле не работать для DataForm, но подходит для той же проблемы при использовании DataGrid. но я помещаю это здесь как ответ, потому что это было интересное чтение и помогло мне понять некоторые вещи, когда я столкнулся с той же самой проблемой.