Привязать коллекцию к списку WPF - PullRequest
1 голос
/ 19 июля 2011

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

CustomerList.DataContext = Customers;

--- Оригинальный вопрос (с обновленным кодом) ---

У меня проблемы с привязкой данных в проекте WPF.

У меня есть класс Customer, следующий:

public class Customer
{
    public String Name { get; set; }    
    public String Email { get; set; }
}

В коде моего XAML у меня есть следующая коллекция клиентов:

public List<Customer> Customers { get; set; }

Я пытаюсь привязать каждого клиента к ListBox с помощью ListItemTemplate, отображающего информацию о клиенте (имя / адрес электронной почты) в TextBoxes вместе с кнопкой, которая блокирует / разблокирует TextBoxes (устанавливает для свойства IsEnabled значение true или false).

Какой лучший способ сделать это?

Пока я пытался следовать ему безуспешно.

В XAML в настоящее время у меня есть следующее (пока игнорируя часть переключателя, я просто пытаюсь внести саму коллекцию в список):

<Window.Resources>
    <CollectionViewSource x:Key="Customers" Source="{Binding Path=Customers, Mode=TwoWay}"/>
    <DataTemplate x:Key="Customer">
        <StackPanel Orientation="Horizontal">
            <TextBox Content="{Binding Name}" />
            <TextBox Content="{Binding Email}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<StackPanel>
    <ListBox ItemsSource="{Binding Source={StaticResource Customers}}"
             ItemTemplate="{StaticResource ResourceKey=Customer}"
             Name="CustomerList"
             Height="300" />
</StackPanel>

Ответы [ 3 ]

1 голос
/ 25 ноября 2012

Код, аналогичный обновленному, работает у меня после изменения

<TextBox Content="{Binding Name}" />

на

<TextBox Text="{Binding Name}" />

Поскольку TextBox не имеет свойства Content (например, Label), первый отказался компилироваться в VS.

Ну, в определении он установлен на Text:

[ContentPropertyAttribute("Text")]
public class TextBox : TextBoxBase, IAddChild

Но я думал, что он используется только в скобках (<TextBox>Like so</TextBox>)?

Может ли это быть источником проблемы?

0 голосов
/ 19 июля 2011

Попробуйте установить ItemsSource вашего CustomerList следующим образом: ItemsSource="{Binding}". Вы установили DataContext ListBox для списка клиентов, вам нужно установить для ItemsSource ту же коллекцию, следовательно, прямую привязку.

Еще одна вещь, которую вы можете сделать, если вы предпочитаете использовать CollectionViewSource, это установить для DataContext вашего окна тот же класс DataContext=this, потому что без этого определение ресурса не сможет найдите коллекцию «Клиенты», которую вы определили в коде. Однако, если вы сделаете это, вам не понадобится CustomerList.DataContext = Customers;, потому что вы напрямую назначаете ItemsSource статическому ресурсу, а не относительно DataContext.

Еще одна вещь. Я думаю, что вы должны дать CollectionViewSource и соответствующую коллекцию в коде под разными именами. Это не вызовет проблем во время выполнения, но усложнит поддержку кода;)

Надеюсь, это поможет:)

0 голосов
/ 19 июля 2011

Вам нужно изменить

ItemsSource="{Binding Source=Customers}"

на

ItemsSource="{Binding Source={StaticResource Customers}}" DataContext="{StaticResource Customers}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...