DataBinding динамически создает JPEG в WPF - PullRequest
2 голосов
/ 21 декабря 2011

В моем приложении WPF я динамически создаю файлы JPEG.Они сохраняются в bin / Debug или bin / Release.

У меня есть привязка данных WrapPanel с контролем изображения, использующим ValueConverter, например:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return new Uri(value.ToString(), UriKind.RelativeOrAbsolute);
}

AnПример значения для Images\400\26.jpg, который, как я полагаю, по умолчанию выглядит в bin \ Debug или bin \ Release.

Моя проблема в том, что я не могу связать элементы управления изображениями с динамически созданнымиJPEGs.Но я могу привязать данные к другим jpeg, которые я пометил как Include и чьи BuildAction равны Content.

Как мне привязать данные к динамически создаваемым изображениям, которых нет во время компиляции?

1 Ответ

4 голосов
/ 22 декабря 2011

Вы можете создать коллекцию путей к изображениям и добавить к ней каждый путь к вновь создаваемому изображению.Теперь вы можете привязать свою обертку к этой коллекции.

Вы можете реализовать эту коллекцию в классе ViewModel, а затем сделать этот класс ViewModel вашим DataContext и связать вашу wrapPanel с этой коллекцией с помощью вашего конвертера.

Редактировать: Вот примеры файлов:

MainWindowViewModel.cs:

using System;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace wpfJpegBindingSample
{
    class MainWindowViewModel : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged 
        public event PropertyChangedEventHandler PropertyChanged;

        // Create the OnPropertyChanged method to raise the event
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
        #endregion

        //constructor
        public MainWindowViewModel()
        {
            m_imagesList = new ObservableCollection<Uri>();
        }

        //collection of images' Uris
        private ObservableCollection<Uri> m_imagesList;

        //property for the collection (so you can bind to it)
        public ObservableCollection<Uri> ImagesList
        {
            get 
            {
                return m_imagesList;
            }
        }

        //an Add method that update the bindings
        public void Add(Uri uri)
        {
            ImagesList.Add(uri);
            OnPropertyChanged("ImagesList");
        }

    }
}

MainWindow.xaml.cs:

using System.Windows;

namespace wpfJpegBindingSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = m_viewModel = new MainWindowViewModel();
        }

        private MainWindowViewModel m_viewModel;
    }
}

MainWindow.xaml:

<Window x:Class="wpfJpegBindingSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView ItemsSource="{Binding ImagesList}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <Image Source="{Binding}"/>
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </Grid>
</Window>

Как вы можетевидите, в модели представления мы определили коллекцию Uris изображений.В коде основного окна мы устанавливаем объект этой модели представления как контекст данных нашего окна, а в xaml мы устанавливаем источник Item нашего listView (или любого другого элемента управления, который вы выбираете) для привязки свойства ImagesList к нашим данным.context, который является моделью представления.

Наконец, мы можем модифицировать вашу динамическую функцию jpeg creator:

        private void dynamicallyJpegCreator(string newImagePath)
        {

            // Creating Image code
            // .....
            // Create new image at newImagePath

            m_viewModel.Add(new System.Uri(newImagePath, System.UriKind.RelativeOrAbsolute));

        }

В этот момент вы получите просмотр списка, отображающий список динамически создаваемых изображений

...