WPF настроил ItemsControl и Binding - PullRequest
0 голосов
/ 23 июня 2010

Я создал собственный ItemsControl под названием Toolbox.Я хочу иметь возможность отображать изображения в этой панели инструментов - это часть дизайнера диаграмм.

Мой xaml выглядит следующим образом:

<d:Toolbox ItemsSource="{Binding}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>

                                    <Image Source="{Binding Library}"/>

                                </DataTemplate>

                            </ItemsControl.ItemTemplate>
                        </d:Toolbox>

и моя ViewModel:

 public ObservableCollection<ElectricalLibrary> l = null;
        public ObservableCollection<Image> _images = null;
        public ObservableCollection<Image> Library

        {
            get
            {
                if (l == null)
                {
                    DataAccessLayerClass dc = new DataAccessLayerClass();
                    dc.LoadComponents();
                    l = dc.Library;
                    foreach (ElectricalLibrary lib in l) { 
                        Image finalImage = new Image();
                        finalImage.Width = 80;
                        BitmapImage logo = new BitmapImage();
                        logo.BeginInit();
                        logo.UriSource = new Uri(lib.url.ToString());
                        logo.EndInit();

                        finalImage.Source = logo;
                        MessageBoxResult result = MessageBox.Show(logo.UriSource.ToString());  

                        _images.Add(finalImage);
                    }



                }
                return _images;
            }
            set { _images = value; }
        }

И это файл ресурсов для самой панели инструментов:

<Style TargetType="{x:Type s:Toolbox}">
        <Setter Property="SnapsToDevicePixels"
                Value="true" />
        <Setter Property="Focusable"
                Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                            Padding="{TemplateBinding Control.Padding}"
                            BorderBrush="{TemplateBinding Border.BorderBrush}"
                            Background="{TemplateBinding Panel.Background}"
                            SnapsToDevicePixels="True">
                        <ScrollViewer VerticalScrollBarVisibility="Auto">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel Margin="0,5,0,5"
                               ItemHeight="{Binding Path=DefaultItemSize.Height, RelativeSource={RelativeSource AncestorType=s:Toolbox}}"
                               ItemWidth="{Binding Path=DefaultItemSize.Width, RelativeSource={RelativeSource AncestorType=s:Toolbox}}" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Я храню только URL-адреса изображений в базе данных, изображения хранятся на диске.Я беру объект сущности и создаю изображение, добавляю его в ObservableCollection изображений и связываю элемент управления Image с LIbrary в xaml.

Очевидно, что код не работает.Но как заставить это работать?Список с изображениями загружен правильно.

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

**** EDIT **** Правильно - мне удалось заставить код работать после некоторых изменений. Измените свойство Library, чтобы оно возвращало список наборов Uri из объектов базы данных - убедитесь, что вы действительно что-то возвращаете. Я предлагаю следующее для вашей собственности (измените ее, если вам нужно более надежное свойство, которое не обновляется каждый раз при получении ...

public ObservableCollection<Uri> Library
{
    get
    {
        OberservableCollection<Uri> library = new OberservableCollection<Uri>();
        DataAccessLayerClass dc = new DataAccessLayerClass();
        dc.LoadComponents();

        foreach (ElectricalLibrary lib in dc.Library)
        {
            library.Add(new Uri(lib.url.ToString()));
        }

        return library;
    }

Тогда ваш XAML может выглядеть так:

                      <d:Toolbox ItemsSource="{Binding Library}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>

                                    <Image Source="{Binding}"/>

                                </DataTemplate>

                            </ItemsControl.ItemTemplate>
                        </d:Toolbox>

Это заставляет меня работать нормально.

Оригинальный текст оставлен по историческим причинам

Кажется, вы связываете изображение со всей коллекцией. Если вам нужен только один список изображений, то набор элементов ItemsSource вашего набора должен быть библиотечной коллекцией с изображением как частью DataTemplate (сейчас я не могу проверить это, поэтому код может быть не на 100% точным)

<d:Toolbox ItemsSource="{Binding Library}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <Image Source="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</d:Toolbox>
1 голос
/ 23 июня 2010

Попробуйте это:

<d:Toolbox ItemsSource="{Binding Library}"> 
<Image Source="{Binding}"/>
...