我有一个DevExpress GridControl,它使用Student类型的ObservableCollection作为其ItemsSource。
我的GridControl有四列
Name
ID
Favorite Subject
GPA
名称,收藏主题和GPA是学生的属性,因此它们是准确绑定的。
问题是,我不想为学生提供ID属性。我想在主持GridControl的学生的ObservableCollection中将ID设置为1 + Student实例的索引。
因此,如果我有三名学生,则ID列将显示为
1
2
3
我怀疑我的View模型中需要一个Ints类型的ObservableCollection,但是我无法为ID列使用不同的ItemsSource。我只能引用GridControl的Parent ItemsSource。由于ItemsSource是一个类型为Student的ObservableCollection,而ID不是Student的属性,我似乎无法将列设置为适当的值(如上所述)。
<dxg:GridControl Style="{StaticResource StudentsGridControl}"
ItemsSource="{Binding StudentsCollection}" SelectedItem="{Binding SelectedStudent}">
<dxg:GridControl.Columns>
<dxg:GridColumn Width="200" HorizontalHeaderContentAlignment="Center" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}">
<dxg:GridColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Student Name" Style="{StaticResource BaseColumnHeaderStyle}"/>
</DataTemplate>
</dxg:GridColumn.HeaderTemplate>
<dxg:GridColumn.HeaderStyle>
<Style TargetType="Control">
<Setter Property="Background" Value="#22322"/>
</Style>
</dxg:GridColumn.HeaderStyle>
</dxg:GridColumn>
<dxg:GridColumn Width="50" HorizontalHeaderContentAlignment="Center"
Binding= // This is the ID Column
<dxg:GridColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="ID" Style="{StaticResource BaseColumnHeaderStyle}"/>
</DataTemplate>
</dxg:GridColumn.HeaderTemplate>
<dxg:GridColumn.HeaderStyle>
<Style TargetType="Control">
<Setter Property="Background" Value="#123453"/>
</Style>
</dxg:GridColumn.HeaderStyle>
</dxg:GridColumn>
<dxg:GridColumn Width="230" HorizontalHeaderContentAlignment="Center" Binding="{Binding FavoriteSubject, UpdateSourceTrigger=PropertyChanged}">
<dxg:GridColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Favorite Subject" Style="{StaticResource BaseColumnHeaderStyle}"/>
</DataTemplate>
</dxg:GridColumn.HeaderTemplate>
<dxg:GridColumn.HeaderStyle>
<Style TargetType="Control">
<Setter Property="Background" Value="#52648F"/>
</Style>
</dxg:GridColumn.HeaderStyle>
</dxg:GridColumn>
<dxg:GridColumn Width="50" HorizontalHeaderContentAlignment="Center" Binding="{Binding GPA, UpdateSourceTrigger=PropertyChanged}">
<dxg:GridColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="GPA"Style="{StaticResource BaseColumnHeaderStyle}"/>
</DataTemplate>
</dxg:GridColumn.HeaderTemplate>
<dxg:GridColumn.HeaderStyle>
<Style TargetType="Control">
<Setter Property="Background" Value="#52658F"/>
</Style>
</dxg:GridColumn.HeaderStyle>
</dxg:GridColumn>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView Style="{StaticResource StudensTable}"/>
</dxg:GridControl.View>
</dxg:GridControl>
答案 0 :(得分:0)
作为解决方案之一,您可以使用MultiBinding
来查找索引或在MultiValueConverter
中找到您想要的内容:
public class MValConv : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
try
{
if(values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue)
return -1;
if (values.Length == 2 && values[0] is ObservableCollection<Student> ocol && values[1] is Student st)
{
return (ocol.IndexOf(st) + 1).ToString();
}
}
catch (Exception)
{
}
return Binding.DoNothing;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException("one way only");
}
}
<Window.Resources>
<local:MValConv x:Key="MValCnv"/>
</Window.Resources>
<dxg:GridColumn.Binding>
<MultiBinding Converter="{StaticResource MValCnv}">
<Binding Path="DataContext.StudentsCollection" RelativeSource="{RelativeSource AncestorType=dxg:GridControl}"/>
<Binding/>
</MultiBinding>
</dxg:GridColumn.Binding>
嗯,如果它是DevExpress的bug,那么你可以尝试使用常规绑定+ ValueConverter和集合的依赖属性。
答案 1 :(得分:0)
只需为您的学生课程创建一个StudentViewModel,不要忘记将SELECT * FROM `order`
WHERE (`status` = 3)
AND
((`order`.`application_id` = 1) AND (`order`.`branch_id` = 2))
更改为StudentsCollection
。 ViewModels用于避免将模型直接绑定到View,它还允许您在不影响模型的情况下声明其他属性,如本例中的ObservableCollection<StudentViewModel>
。
让我们假装这是你的学生班:
ID
您的StudentViewModel可能是这样的:
public class Student
{
public string Name { get; set; }
public string FavoriteSubject { get; set; }
public string GPA { get; set; }
}