Arhn - архитектура программирования

Привязка ко второму свойству

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

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

Модель просмотра:

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.

13.12.2014

  • В чем проблема? Не отображается Towns или вы не знаете, как выбрать Town для Premise? 13.12.2014
  • @dkozl Я не вижу ни одного Towns в моем поле со списком. Я подозреваю, что это связано с тем, что WPF ищет свойство Premises.Towns, которое не существует и поэтому не показывает никаких данных. 13.12.2014
  • @dkozl А вы знаете, что нужно сделать, чтобы я мог легко выбрать город для помещения? 13.12.2014

Ответы:


1

Вы правы в своем предположении. 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

13.12.2014
  • Действительно, это трюк. Спасибо за быструю помощь! Теперь выясним проблемы с производительностью при отображении ›2500 элементов. 13.12.2014
  • Видите ли вы проблемы с производительностью более 2500 элементов в ComboBox? 13.12.2014
  • Я вижу задержку в 5–7 секунд между нажатием на поле со списком и просмотром элементов. 13.12.2014
  • Это потому, что ComboBox не поддерживает виртуализацию, поэтому сначала будет создано ComboBoxItem для каждого элемента в вашей коллекции. 13.12.2014
  • Есть ли элемент управления, который позволяет виртуализации делать то же самое? 13.12.2014

  • 2

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

    13.12.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..