WPF DataGridTemplateColumn,绑定到通用CellTemplate

时间:2012-12-13 14:42:57

标签: wpf datagrid datatemplate datagridtemplatecolumn

我对WPF很新,很抱歉,如果这很明显,但我似乎无法在互联网上找到任何体面的例子来说明它是如何完成的。

我有一个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上指定Binding?

我很欣赏正确方向的任何指示,

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果您不能使用Jesper Gaarsdal选项,您也可以使用CellStyle并在column-declaration中定义绑定。

请参阅此示例:How to reuse WPF DataGridTemplateColumn (including binding)