如何在XAML中指定DataGrid的ItemsSource类型?

3
我正在将一个DataGrid绑定到ICollectionView,以便我可以有效地过滤ItemsSource,但是ICollectionView不是泛型类型(例如CollectionView<MyType>) - 它是List<object>类型。因此,在XAML编辑器中,VisualStudio无法确定类型,所以我无法获得任何IntelliSense帮助来绑定集合视图中对象的属性。它仍然可以构建和运行,但我在设计时没有获得帮助。 重述问题:有没有办法在XAML中“转换”数据绑定?
我认为我可以通过<DataGrid.DataContext>做些什么,但我记不清了,而且我也没有在谷歌上找到任何有用的信息:
XAML:
<DataGrid ItemsSource="{Binding MyCollectionView}">
    <DataGrid.DataContext>
        <!-- Specify the type of objects in MyCollectionView somehow -
                 something like 'x:type="MyType"' -->
    </DataGrid.DataContext>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <!-- Cannot resolve property 'Approved' in data context of type 'MyProject.MainWindow'. -->
                <DataTrigger Binding="{Binding Approved}" Value="False">
                    <Setter Property="Background" Value="LightGray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <!-- Cannot resolve property 'Approved' in data context of type 'object'. -->
        <DataGridTextColumn Header="Is Approved"
                            Binding="{Binding Approved}"
                            Width="3*" />
    </DataGrid.Columns>
</DataGrid>

代码后台:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public ICollectionView MyCollectionView { get; set; }

    public MainWindow(List<MyType> parameter)
    {
        // ...

        MyCollectionView = new CollectionView(parameter);

        // ...
    }
}

public class MyType
{
    public bool Approved { get; set; }

    // ...
}

你已经说明了为什么它在设计时不起作用,但是你是说绑定应该工作时运行时失败了吗? - ΩmegaMan
"ICollectionView不是通用类型-它是List<object>类型。" List<object> 是一个通用的集合类型。我们能否看到MyCollectionView被定义如何,以及该集合本身如何被定义?集合中的对象是否实际上具有名为Approved的属性? "recognized"是什么意思? - 15ee8f99-57ff-4f92-890c-b56153
@OmegaMan 不,它仍然可以构建和运行。我的问题只是如何在设计时指定ItemsSource实际上是List<MyType>,而不是List<object> - 获取所有智能感知和类型检查的好处。我更新了我的问题以回应您的评论。 - tehDorf
@EdPlunkett ICollectionView在C#中并不是“泛型”(ICollectionView是.NET类型)。所谓“未被识别”,是指我在“Approved”下面得到了一个建议波浪线,并且消息显示为“无法解析类型'MyProject.MainWindow'上下文中的属性'Approved'”。我更新了我的问题以回应您的评论。 - tehDorf
由于这是一个设计时问题,请将您的 Visual Studio 版本作为标签放入。 - ΩmegaMan
2个回答

3
我曾经认为我可以用某种方法来处理,但是我不记得具体是什么了,而且我也没有在谷歌上找到任何有用的信息:
我相信你要找的是设置设计时数据上下文。请参阅以下链接以获取更多关于此的信息。
XAML:绑定和数据上下文的智能感知:https://blogs.msmvps.com/deborahk/xaml-intellisense-for-bindings-and-the-data-context/ 如何在XAML编辑器中查看设计时数据绑定(在运行时它可以工作)? 我想问的是,在XAML中是否有将数据绑定“转换”为MyType集合的方法?
没有。但是,您可以按照上述说明指定设计时DataContext。

1
MS MVP链接提供了我所需要的内容:d:DataContext="{d:DesignInstance Type=vms:CustomerListViewModel, IsDesignTimeCreatable=True}" - tehDorf

0
VisualStudio 无法确定类型。
由于类型直到运行时才被表达并通过代码使用反射获得,因此设计师处于不利地位,只能推断它所知道的。而它所知道的只是一个对象,但不是开发人员所知道的确切类型。
我没有得到任何 IntelliSense 帮助......仍然可以构建和运行,但我在设计时没有得到帮助。
如果这是阻碍您前进的问题,我建议您暂时将属性类型列表添加到 VM(如果不是 MVVM,则为页面),然后绑定到该新属性。然后设计时间将看到它所需的内容,您可以借助 Visual Studio 的帮助获取属性信息添加绑定/样式。
一旦一切都好了,就将设计时间绑定替换为您提到的 ICollection。

是的,我理解了 - 我知道问题出在哪里。我想问的是,在XAML中是否有将数据绑定“转换”为MyType集合的方法? - tehDorf
据我所知,在XAML中没有办法进行强制转换。@tehDorf - ΩmegaMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接