我在WPF应用程序中有一个DataGrid。这个数据网格的itemssource是一个由不同类型的对象组成的List。我还有一个转换器,可以根据一定的规则将不同源类型的所有对象转换为一个匿名对象。是否有可能在xaml转换器应用到itemssource的每个元素?
这是我的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<object> dataSource = new List<object>()
{
new BvFile { Name = "file1", Size = 200 },
new BvFolder { Name = "folder"}
};
//lbox.ItemsSource = dataSource;
dGridTest.ItemsSource = dataSource;
var bp = 0;
}
}
class BvFolder
{
public string Name { get; set; }
}
class BvFile
{
public string Name { get; set; }
public int Size { get; set; }
}
public class BvElementConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string nameValue = null;
string sizeValue = null;
if (value is BvFile)
{
BvFile file = value as BvFile;
nameValue = file.Name;
sizeValue = file.Size.ToString();
}
if (value is BvFolder)
{
BvFolder file = value as BvFolder;
nameValue = file.Name;
sizeValue = "this is folder";
}
return
new
{
Name = nameValue,
Size = sizeValue
};
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
XAML:
<GridSplitter></GridSplitter>
<DataGrid x:Name="dGridTest" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"
Header="Наименование"/>
<DataGridTextColumn Binding="{Binding Size}"
Header="Размер"/>
</DataGrid.Columns>
</DataGrid>
我试着:
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="DataContext"
Value="{Binding Path=DataContext,
RelativeSource={RelativeSource Self},
Converter={StaticResource ElementConverter}}">
</Setter>
</Style>
</DataGrid.ItemContainerStyle>
预期:每个数据row将获得转换后的项
没有必要使用转换器。addFallbackValue
to Size column binding:
<DataGrid x:Name="dGridTest" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"
Header="Наименование"/>
<DataGridTextColumn Binding="{Binding Size, FallbackValue='This is folder'}"
Header="Размер"/>
</DataGrid.Columns>
</DataGrid>