为每个条目WPF DataGrid应用转换器



我在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将获得转换后的项

没有必要使用转换器。addFallbackValueto 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>

最新更新