2014-12-13 4 views
1

У меня есть два свойства в моей модели, называемые Premises и Towns. Я привязываю свои ListViewItems к Premises, а в itemtemplate я хочу привязать к Towns, но когда я использую следующий XAML, он пытается привязать к Premises.Towns вместо Towns.Связывание со вторым свойством

Как я могу связать с Towns напрямую?

ViewModel:

public class MainWindowViewModel 
{ 
    public ObservableCollection<Premise> Premises; 
    public List<Town> Towns; 
} 

XAML:

<ListView x:Name="PremisesList" Margin="195,35,10,10" 
       ItemContainerStyle="{StaticResource OverviewListViewItemStyle}" 
     ItemsSource="{Binding Premises}" HorizontalContentAlignment="Stretch"> 

И это то, что в моем OverviewListViewItemStyle.

<ComboBox ItemsSource="{Binding Towns}" Grid.Row="2" Grid.ColumnSpan="3"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <ComboBoxItem> 
        <TextBox Text="{Binding Name}" /> 
       </ComboBoxItem> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

Я хотел бы, чтобы быть в состоянии выбрать Town для Premise через XAML.

+0

Где проблема? Он не отображает «Города» или вы не знаете, как выбрать «Город» для «Помещения»? – dkozl

+0

@dkozl Я не вижу, чтобы какие-либо «города» были в моем поле со списком. Я подозреваю, что это связано с тем, что WPF ищет свойство «Premises.Towns», которое не существует и, следовательно, не показывает никаких данных. –

+0

@dkozl Вы также знаете, какие шаги предпринять, чтобы я мог легко выбрать город для помещения? –

ответ

2

Вы правы в своем предположении. ComboBox ищет Towns в Premise Класс, который является классом за каждого ListViewItem Если вы хотите, чтобы связался с вами, то ListView вам нужно использовать привязку RelativeSource.

<ComboBox 
    ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.Towns}" 
    Grid.Row="2" 
    Grid.ColumnSpan="3" 
    DisplayMemberPath="Name"/> 

не связаны с вашей проблемой, но вы также не нужно указывать DataTemplate для отображения одного свойства. DisplayMemberPath также будет работать. Если вы указываете DataTemplate вам не нужно использовать ComboBoxItem как ComboBox окутает DataTemplate содержание в ComboBoxItem настолько эффективно, вы в конечном итоге с ComboBoxItem внутри другого ComboBoxItem

+0

Действительно, это делает трюк. Спасибо за вашу быструю помощь! Теперь выясним проблемы производительности с отображением> 2500 элементов. –

+0

Вы видите какие-либо проблемы с производительностью с более чем 2500 элементами в 'ComboBox'? – dkozl

+0

Я вижу задержку 5-7 секунд между нажатием на поле со списком и просмотром элементов. –

1

Вы обязывать ItemsSource в собственность помещений, следовательно, если вы свяжете на Города в OverviewListViewItemStyle, механизм привязки будет искать в объекте Premise для свойства Towns. Если вы хотите выбрать город для помещения, вы должны указать в поле со списком, откуда следует искать это свойство. Вы можете попытаться установить datacontext combobox в основной режим просмотра с относительным источником в привязке. Что-то вроде этого: ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.Towns}"

Смежные вопросы