DataBinding在WPF中动态创建了jpegs

时间:2011-12-21 19:10:52

标签: wpf jpeg

在我的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);
}

值的示例值是Images\400\26.jpg,我假设默认情况下在bin \ Debug或bin \ Release中查找。

我的问题是,我似乎无法将图像控件数据绑定到动态创建的jpeg。但是我可以将其标记为Include且其BuildActionContent的其他jpeg数据绑定。

如何数据绑定到编译时不存在的动态创建的图像?

1 个答案:

答案 0 :(得分:4)

您可以创建图像路径的集合,并在每个新创建的图像路径中添加它。现在你可以将你的wrappanel绑定到这个集合了。

您可以在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中,我们将listView(或您选择的任何其他控件)的Item源设置为绑定属性ImagesList,在我们的数据中上下文是视图模型。

最后,我们可以修改动态jpeg创建器功能:

        private void dynamicallyJpegCreator(string newImagePath)
        {

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

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

        }

此时,您将获得列表视图显示动态创建的图像列表