XAML 如何按绑定到WPF中接口属性的列对DataGrid进行排序?

ikfrs5lh  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个绑定到ViewModel集合的视图中的DataGrid,该DataGrid中的某些列绑定到接口属性,因为该对象使用接口的默认实现来实现这些属性。
下面是接口和类的简化:

namespace Interfaces
{
    public interface IExampleInterface
    {
        public object ExampleProperty1 { get; }
        public object ExampleProperty2 { get; }
        public object ExampleProperty3
        {
            // Returns value calculated using ExampleProperty1 & ExampleProperty2.
        }
    }
}
namespace Models
{
    public class ExampleObject : Interfaces.IExampleInterface
    {
        public object ExampleProperty1 { get; set; }
        public object ExampleProperty2 { get; set; }
    }
}

集合定义为:

public List<ExampleObject> Objects
{
    get
    {
        return _objects;
    }
    set
    {
        _objects = value;
        // Raises the PropertyChanged event for the property.
    }
}

下面是一个xaml的例子:

<DataGrid ItemsSource="{Binding Objects}">
    <DataGrid.Columns>
        <!--Other Columns-->
        <DataGridTextColumn Binding="{Binding Path=(interfaceNamespace:IExampleInterface.ExampleProperty3)}" />
        <!--Other Columns-->
    </DataGrid.Columns>
</DataGrid>

问题是,每当用户选择这些接口属性绑定列之一的标头作为DataGrid的排序依据时,DataGrid不会排序,并且Visual Studio的“输出”窗口显示以下错误:
系统.Windows.数据错误:40:BindingExpression路径错误:在“object”“ExampleObject”(HashCode=6249895)上未找到“(0)”属性。null
是否有一种方法允许用户按其内容绑定到接口属性的列对DataGrid进行排序?
我尝试将集合的类型更改为ObservableCollection,认为问题可能是属性排序后视图没有得到通知,但没有骰子。
我还使用接口默认实现的副本实现了类中的属性。这种方法确实有效,但却违背了为接口提供默认实现的目的,这就是为什么我希望有另一种更好的方法来实现这一点。

thtygnil

thtygnil1#

尝试设置列的SortMemberPath属性:

<DataGridTextColumn SortMemberPath="(interfaceNamespace:IExampleInterface.ExampleProperty)" ... />

相关问题