2012-12-13 80 views
0

我對WPF很陌生,所以很抱歉,如果這是顯而易見的,但我似乎無法在互聯網上找到任何體面的示例來展示它是如何完成的。WPF DataGridTemplateColumn,綁定到通用CellTemplate

我有一個DataGrid綁定到一個名爲MyCollection的DataItem的集合。我想創建一個通用的DataTemplate,可以用於網格中的多列(以及應用程序中的其他地方,我需要它)。

E.g.

<DataGrid ItemsSource="{Binding MyCollection}" AutoGenerateColumns="False" SelectionUnit="Cell" EnableColumnVirtualization="True"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="File path" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
      <DataGridTemplateColumn Header="File path2" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
      <DataGridTemplateColumn Header="File path3" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
... 

我的DataTemplate此刻正在我的應用程序資源定義爲

<DataTemplate x:Key="FileSelectorEditorTemplate"> 
     <Grid> 
      <TextBox Text="{Binding FilePath.PhysicalPath}" HorizontalAlignment="Stretch" Margin="0,0,35,0" /> 
      <Button Content="..." Height="25" Width="25" Margin="0,0,5,0" HorizontalAlignment="Right" Click="FileOpen_Click" /> 
     </Grid> 
    </DataTemplate> 

現在的問題是,在DataTemplate中指定,而我需要應用不同的結合爲每個綁定視圖模型上的屬性FilePath,FilePath2,FilePath3。我似乎無法指定DataGridTemplateColumn上的綁定?

我很感謝在正確的方向上的任何指針,

謝謝!

+0

我認爲它應該幫助你http://www.codeproject.com/Articles/43525/WPF-DataGrid-Using-DataTemplates-for-auto-generate –

回答

0

DataGridTemplateColumn上的綁定在其CellTemplate中指定。 如果你想要三列的不同綁定,我會說你必須爲每一列做一個不同的DataTemplate。可能有一些解決方法,但我懷疑它會很漂亮。

編輯: 擁有不同的模板,您可以使用DataTemplateSelector爲當前對象選擇正確的模板。

使用的IValueConverter(只是一個速寫,但應工作):

<DataTemplate x:Key="GenericTemplate" > 
     <TextBlock FontSize="14" > 
      <TextBlock.Text> 
       <Binding Converter="{StaticResource NewValue}" Path="Me" /> 
      </TextBlock.Text> 
     </TextBlock> 
</DataTemplate> 

public class NewValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     someContainer obj = value as someContainer; 
     if (obj.type == MyType.First) 
      return (string)(obj.val1); 
     else 
      return (string)(obj.val2); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public enum MyType 
{ 
    First, 
    Second 
} 

public class someContainer 
{ 
    public someContainer Me { get; set; } 
    public string val1 { get; set; } 
    public string val2 { get; set; } 
    public MyType type; 

    public someContainer() 
    { 
     Me = this; 
     val1 = "string1"; 
     val2 = "string2"; 
    }  
} 

... 
public ObservableCollection<someContainer> myList {get; set;} 
... 

<StackPanel Margin="0,10,0,0" Orientation="Vertical" Grid.Column="2"> 
     <ItemsControl ItemsSource="{Binding MyList}" ItemTemplate="{StaticResource GenericTemplate}" /> 
    </StackPanel> 
+1

這似乎對我來說很可笑。當然,WPF中必須有一種方法來創建一個通用模板,我可以在整個應用程序中重用同一類型的不同屬性。 – magritte

+0

也許你可以在'DataTemplate'的綁定中使用'IValueConverter'。我在這裏發佈了一個示例:http://stackoverflow.com/questions/13860046/limit-rows-height-on-both-auto-and-1-in-wpf/13860478#13860478 – JGaarsdal

+0

謝謝Jesper,但我不是肯定有幫助嗎?我不會仍然有如何在數據模板中指定綁定的問題嗎? – magritte

相關問題