如何将GridColumn绑定到ObservableCollection的索引值?

时间:2018-03-22 17:24:13

标签: c# wpf xaml devexpress

我有一个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>

2 个答案:

答案 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; }
}