2013-10-11 61 views
2

我對WPF很陌生,我試圖使用dataGrid。我試圖展示的一些數據是圖片。首先,我試圖只結合這樣的數據:WPF將控件綁定到未知屬性

DataGrid.ItemsSource = <some collection> 

這導致與含有路徑圖像,而不是顯示圖像的一列。

我開始周圍的Googling,我想出了以下內容:
我創建了一個數據模板:

<DataTemplate x:Key="ImageDataTemplate"> 
    <Image Source="{Binding Image}"/> 
</DataTemplate> 

我加入AutoGeneratingColumn事件的功能,在那裏我把下面的代碼:

if (typeof(System.Windows.Media.ImageSource).IsAssignableFrom(e.PropertyType)) 
{ 
    DataGridTemplateColumn dgtc = new DataGridTemplateColumn(); 
    dgtc.Header = e.Column.Header; 
    dgtc.CellTemplate = this.FindResource("ImageDataTemplate") as DataTemplate; 

    e.Column = dgtc; 
} 

女巫工作正常,只要我呼叫我所有的圖像屬性Image有沒有辦法變得更靈活一點? (我想在一個類中的幾個圖像,或者意味着圖像屬性的全名,並且我不喜歡幾乎重複的代碼)

回答

0

也就是說你那裏,看到這個詞「未知」一個非常誤導的標題是無處在你的問題。無論哪種方式,DataGrid都是一個有點複雜的控件,你似乎從WinForms的角度來看待它,通過使用C#代碼來操作它,而不是像在WPF中習慣的那樣簡單地定義你希望在XAML中看起來如何。 。

我會強烈建議您閱讀如何在繼續......還有很多教程在那裏,之前使用它的方式WPF一些教程,但WPF DataGrid Control一個WPF的Tutorials.NET是一個很好的一開始。

總之,你可以從鏈接教程定義了每個列的內容看起來像在XAML ...:

<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Image" Width="SizeToCells" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Image Source="{Binding Image}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
0

我個人DataGrid的AutoGenerateColumns屬性設置爲false,和在XAML中手動創建列。

AutoGenerateColumns不是那麼有用的國際海事組織。您經常在您的模型中擁有屬性,您不希望在列中顯示這些屬性,並且如果它最終由AutoGeneratingColumn事件的處理程序結束,那麼您將失去不編寫列顯示代碼的好處。

0

您可以將數據網格綁定到一個可觀察的收集和構建這樣的集合...

public class ViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<ImageContainer> MyImageCollection { get; set; } 
    public ViewModel() 
    { 
     MyImageCollection = new ObservableCollection<ImageContainer>(); 
     MyImageCollection.Add(new ImageContainer{Source = xxx}); 
    } 
    #region INotifyPropertyChanged Implementation 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string name) 
    { 
     var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null); 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    #endregion 
} 
public class ImageContainer : INotifyPropertyChanged 
{ 
    private BitmapImage _source; 
    public BitmapImage Source 
    { 
     [DebuggerStepThrough] 
     get { return _source; } 
     [DebuggerStepThrough] 
     set 
     { 
      if (value != _source) 
      { 
       _source = value; 
       OnPropertyChanged("Source"); 
      } 
     } 
    } 
    #region INotifyPropertyChanged Implementation 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string name) 
    { 
     var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null); 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    #endregion 
} 

這個代碼片段定義圖像的觀察到的集合,併爲每個圖像的邊界容器。如圖所示,視圖模型構造函數創建了一個集合的實例,並開始用圖像填充它。容器類沒有HAVE實現INPC,但我不知道你在做什麼與圖像,所以INPC(INotifyPropertyChanged)是包括在內。

對應的Xaml看起來像這樣...

<DataGrid ItemsSource="{Binding MyImageCollection}" AutoGenerateColumns="False" > 
     <DataGrid.Columns> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Image Source="{Binding Source}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

如果你是從磁盤讀取圖像,一個流行的變體是綁定到FileInfo類和使用轉換器返回的圖像。這種方法使查看模型不那麼混亂,但是無論哪種設計都會給你想要的東西。事後分析:如果您僅將數據網格用於顯示圖像集合,請考慮使用「項目控制」來代替。這樣做可以避免數據網格的開銷。