Как иметь пользовательский элемент управления в качестве ListBoxItem - PullRequest
2 голосов
/ 01 июня 2010

Я хочу привязать пользовательский элемент управления (View) к ListBoxItem. ListBox привязан к коллекции ViewModels. Я установил ItemTemplate ListBox так:

<ListBox.ItemTemplate>
     <DataTemplate>
           <View:ContactView/>     
     </DataTemplate>
 </ListBox.ItemTemplate>

Но я получаю только пустые элементы ListBoxItems. Я могу нажать на них, но визуально ничего не отображается. Мой код ContactView очень прост:

<Border>
    <DockPanel>
        <StackPanel DockPanel.Dock="Right" Orientation="Vertical">
            <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
            <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
            <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock>
        </StackPanel>
    </DockPanel>
</Border>

Что может быть не так с этим? Спасибо.

Ответы [ 5 ]

1 голос
/ 01 июня 2010

Вы установили свойство ItemSource?

ItemsSource="{Binding}"
1 голос
/ 01 июня 2010

Ваш ContactView не «наследует» контекст данных ItemTemplate. Или, скорее, сам ContactView есть, но «внутренние» элементы управления являются отдельными. Попробуйте:

<View:ContactView DataContext="{Binding Path=.}" />

Path=. - это специальная конструкция, означающая «текущий элемент». Вы даже можете сократить его до {Binding} Я думаю.

Если вы проверите окно вывода, у вас должно появиться несколько ошибок, говорящих о том, что для этих привязок TextBlock не было предоставлено никакого объекта.

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

Кажется, отлично работает с моим примером проекта:

Window1 XAML:

<Window x:Class="WpfApplication7.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication7="clr-namespace:WpfApplication7"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListBox x:Name="myListbox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <WpfApplication7:ContactView/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

ContactView XAML (код не требуется;)):

<UserControl x:Class="WpfApplication7.ContactView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Border>
        <DockPanel>
            <StackPanel DockPanel.Dock="Right" Orientation="Vertical">
                <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
                <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
                <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock>
            </StackPanel>
        </DockPanel>
    </Border>

</UserControl>

Код для Window1:

public partial class Window1
{
    public Window1()
    {
        InitializeComponent();
        myListbox.ItemsSource = new[]
                                    {
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 1 },
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 2 },
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 3 },
                                    };
    }
}

public class Contact
{
    public string ContactFirstName { get; set; }
    public string ContactLastName { get; set; }
    public int ContactNumber { get; set; }
}

Я думаю, что ваша проблема связана с предметами в вашем ItemsSource. Убедитесь, что вы привязываете к правильному свойству. Объекты «Мой контакт» имеют правильные свойства. Возможно, ваши объекты в вашем ItemsSource имеют разные имена свойств? Или у этих объектов есть свойство Contact, которое содержит нужные свойства?

Если у вас есть свойство Contact в ваших объектах ItemsSource, вы можете использовать привязку к TextBlock следующим образом (обратите внимание на точку):

<TextBlock Text="{Binding Path=Contact.FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>

Надеюсь, это поможет немного уточнить, в чем заключается ваша проблема!

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

Когда ваши ViewModels устанавливают свои свойства? Может случиться так, что Binding считывает все значения как нулевые (до того, как данные установлены), а затем не получает уведомлений, когда данные фактически установлены.

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

Использовать Binding Like

<View:NameofControl DataContext="{Binding }" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...