首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGridTemplateColumn,绑定到通用CellTemplate

WPF DataGridTemplateColumn,绑定到通用CellTemplate
EN

Stack Overflow用户
提问于 2012-12-13 22:42:57
回答 2查看 4K关注 0票数 2

我是WPF的新手,所以很抱歉这是显而易见的,但我似乎在互联网上找不到任何像样的例子来说明它是如何做到的。

我有一个绑定到名为MyCollection的DataItem集合的DataGrid。我想创建一个通用的DataTemplate,用于网格中的多个列(以及应用程序中的其他位置,如果我需要的话)。

例如。

代码语言:javascript
复制
<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目前在我的应用程序资源中定义为

代码语言:javascript
复制
<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上的绑定?

如果你能给我指点迷津,我将不胜感激,

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-12-13 22:51:11

DataGridTemplateColumn上的绑定在其CellTemplate中指定。如果您希望这三列使用不同的绑定,我会说您必须为每一列创建不同的DataTemplate。可能会有一些变通方法,但我怀疑它会不会很漂亮。

编辑:具有不同的模板,您可以使用DataTemplateSelector为当前对象选择正确的模板。

使用IValueConverter (只是一个快速草图,但应该可以工作):

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2013-09-23 18:33:21

如果不能使用Jesper Gaarsdal的选项,还可以使用CellStyle并在列声明中定义绑定。

例如:How to reuse WPF DataGridTemplateColumn (including binding)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13862193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档