我是WPF的新手,所以很抱歉这是显而易见的,但我似乎在互联网上找不到任何像样的例子来说明它是如何做到的。
我有一个绑定到名为MyCollection的DataItem集合的DataGrid。我想创建一个通用的DataTemplate,用于网格中的多个列(以及应用程序中的其他位置,如果我需要的话)。
例如。
<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上的绑定?
如果你能给我指点迷津,我将不胜感激,
谢谢!
发布于 2012-12-13 22:51:11
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>发布于 2013-09-23 18:33:21
如果不能使用Jesper Gaarsdal的选项,还可以使用CellStyle并在列声明中定义绑定。
例如:How to reuse WPF DataGridTemplateColumn (including binding)
https://stackoverflow.com/questions/13862193
复制相似问题