2010-06-16 66 views
2

我在用户控件背后的代码中创建了ObservableCollection。xaml中的WPF ObservableCollection

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     Entities db = new Entities(); 
     ObservableCollection<Image> _imageCollection = 
     new ObservableCollection<Image>(); 

     IEnumerable<library> libraryQuery = 
     from c in db.ElectricalLibraries 

     select c; 

     foreach (ElectricalLibrary c in libraryQuery) 
     { 
      Image finalImage = new Image(); 
      finalImage.Width = 80; 

      BitmapImage logo = new BitmapImage(); 
      logo.BeginInit(); 
      logo.UriSource = new Uri(c.url); 
      logo.EndInit(); 

      finalImage.Source = logo; 

      _imageCollection.Add(finalImage); 

     } 

    } 

我需要是基于保存在数据库中的URL创建的图像的ObservableCollection:当窗口负载创建它。但我需要一个ListView或其他的ItemsControl绑定到它在XAML文件是这样的:

但我无法弄清楚如何将的ObservableCollection传递给控制的ItemsSource。我试图创建一个类,然后在xaml文件中创建一个类的实例,但它不起作用。我应该创建一个静态资源以某种方式>

任何帮助将不胜感激。

回答

4

首先,ObservableCollection是一个局部变量。你需要做的是把它作为一个私有的全局变量,并公开它的属性。您可以使用INotifyPropertyChanged接口在实际集合本身更改时自动更新图像数据。

在您的XAML中,您需要将DataContext设置为self,然后您可以将公共属性直接绑定到ItemsSource。您可能希望使用ItemTemplate以自定义方式显示项目。

干杯, 亚当的要求

实施例:

在C#:

public MyWindowClass 
{ 
    public ObservableCollection<image> MyImageCollection 
    { 
    get; 
    set; 
    } 
} 

在XAML:

<UserControl 
... 
DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

... 
<ListBox ItemsSource="{Binding MyImageCollection}" ItemTemplate="*yourtemplateresource*" /> 
... 

</UserControl> 

现在,我提到使用INotifyPropertyChanged的原因是如果你尝试:

MyImageCollection = new ObservableCollection<image>(); 

列表框中的项目不会自动更新。但是,使用ObservableCollection,您需要实现INotifyPropertyChanged,以便基本添加和删除列表项,而不是而不是

+1

除了您可能想要添加更多细节并修复一个小问题外,技术上正确 - * ObservableCollection *已经实现了* INotifyCollectionChanged *和* INotifyPropertyChanged *,因此不需要在您提及的公共属性上重新实现/调用它们。 – slugster 2010-06-16 10:35:49

+0

谢谢你的帮助。你能提供一些小小的代码吗? – Enzomatric 2010-06-16 10:39:14

+0

@slugster - 抱歉,我的回复不清楚。我提到INotifyPropertyChanged的原因纯粹是为了更新列表,如果作者自己的公共属性重新初始化。我可能不应该添加这种多余的信息... @Cloverness - 添加示例... – 2010-06-16 10:46:25

1

您必须将UserControlDataContext设置到您的收藏:

DataContext = _imageCollection 

你可以做的是,在UserControl_Loaded()方法。

接下来你需要将ListViewItemsSource绑定在XAML:

<ListView ItemsSource="{Binding}"/> 

{Binding}相当于{Binding .}结合到UserControlDataContext。如果你需要“更多的东西”你DataContext您可以改为创建这样一个类:

class ViewModel : INotifyPropertyChanged { 
    public ObservableCollection Images { get { ... } } 
    ... 
} 

使用这个类为DataContext

DataContext = new ViewModel(); 

而更换绑定绑定到Images财产:

<ListView ItemsSource="{Binding Images}"/> 

然后你就可以在其他属性添加到ViewModel

class ViewModel : INotifyPropertyChanged { 
    public ObservableCollection Images { get { ... } } 
    public String Message { get { ... } set { ... } } 
    ... 
} 

并将其绑定到一个控制:

<TextBlock Text="{Binding Message}"/> 

还记得什么时候Message财产ViewModel改为触发PropertyChanged事件。这将在代码更改视图模型属性时更新UI。

+0

非常感谢。现在我的代码中有另一个问题。 – Enzomatric 2010-06-16 12:07:24