繁体   English   中英

WPF-将IValueConverter应用于集合绑定

[英]WPF - Apply IValueConverter for collection binding

在我的WPF应用程序中,我有Student和StudentDB类。

class StudentDB
{
   int StudentId{get;set;}
   string  Name{get;set;}
   string  City{get;set;}
   DateTimeOffset BirthDate{get;set;}
}

class Student
{
   int StudentId{get;set;}
   string  Name{get;set;}
   string  City{get;set;}
   DateTime BirthDate{get;set;}
}

两个类之间的主要区别是Birthday属性的数据类型。 一个是DateTime ,另一个是DateTimeOffset

我在我的应用程序中有以下代码。

IEnumerable<StudentDB> StudentDbs = GetAllStudentFromDB();
IEnumerable<Student> Students = new IEnumerable<Student> Students();

XAML:

<DataGrid ItemsSource="{Binding Students, Mode=TwoWay}" AutoGenerateColumns="True">

我需要在DataGrid中显示学生列表。 我无法绑定StudentDbs,因为它具有DateTimeOffset类型的属性。

为了解决上述问题,我需要应用一个Value Converter ,它将把StudentDb对象转换为Student对象。

我知道如何实现IValueConverter接口I。但是我不知道如何将其应用于集合。

谁能建议我解决这个问题的解决方案?

满足您的主要要求:DateTimeOffset类具有一个名为DateTime的属性,该属性表示当前System.DateTimeOffset对象的日期和时间。 因此,您仍然可以将StudentDbs绑定为DataGrid的Itemsource,并且可以直接绑定BirthDate.DateTime属性,无论您希望在DataGrid内实现其需求的任何位置。

您不需要值转换器。

更好的方法是通过LINQ或在ViewModel中通过另一种方式将StudentDB转换为Student ,然后将Student对象的集合绑定到您的DataGrid

IEnumerable<StudentDB> StudentDbs = GetAllStudentFromDB();
IEnumerable<Student> Students = new StudentDbs.Select(student => ConvertToDto(student));

private Student ConvertToDto(StudentDB)
{
    return new Student 
    { 
        StudentId = StudentId, 
        Name = Name, 
        City = City, 
        BirthDate = BirthDate.DateTime 
    };
}

<DataGrid ItemsSource="{Binding Students, Mode=TwoWay}" AutoGenerateColumns="True">

同样,最好使用ObservableCollection<T>防止内存泄漏并允许更改集合。

值转换器必须应用于“列”。 因此,设置AutoGenerateColumns =“ False”并手动添加列:

<DataGrid.Columns>
<DataGridTextColumn Header="{lex:Loc ...}"
Binding="{Binding StarString, Converter={StaticResource ...}}">

当AutoGenerating为true时,请使用DataGrid的AutoGeneratingColumn事件。 在xaml中添加:

<DataGrid ItemsSource="{Binding Students, Mode=TwoWay}" AutoGenerateColumns="True" AutoGeneratingColumn="StartListGrid_OnAutoGeneratingColumn"

在后面的代码中添加以下内容:

private void StartListGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyName == "BirthDate" && e.Column is DataGridTextColumn)
        {
            var textColumn = e.Column as DataGridTextColumn;
            textColumn.Binding = new Binding(e.PropertyName)
            {
                Converter = new MyValueConverter();
            };
        }
    }

请注意,您正在覆盖绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM