Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将WPF控件绑定到模型对象上动态引入的接口_C#_Wpf_Data Binding_Interface_Postsharp - Fatal编程技术网

C# 将WPF控件绑定到模型对象上动态引入的接口

C# 将WPF控件绑定到模型对象上动态引入的接口,c#,wpf,data-binding,interface,postsharp,C#,Wpf,Data Binding,Interface,Postsharp,我正在使用PostSharp的[CompositionSpect]功能将接口动态注入到WPF应用程序中的模型对象。但是,似乎WPF无法正确绑定(显示)属性,除非在模型对象上显式实现相关接口 使用定制的CompositionSpect(ComposeObjectAspect),我能够通过运行时将ModelObject强制转换到引入的接口,直接成功地公开内部IMyInterface对象的属性 // some interface definition, for sample completeness

我正在使用PostSharp的[CompositionSpect]功能将接口动态注入到WPF应用程序中的模型对象。但是,似乎WPF无法正确绑定(显示)属性,除非在模型对象上显式实现相关接口

使用定制的CompositionSpect(ComposeObjectAspect),我能够通过运行时将ModelObject强制转换到引入的接口,直接成功地公开内部IMyInterface对象的属性

// some interface definition, for sample completeness
public interface IMyInterface 
{
    public string MyProperty { get; set; }
}


// model object, which does NOT implement IMyInterface directly, though the interface is dynamically introduced by PostSharp
[ComposeObjectAspect(typeof(IMyInterface))]
public class ModelObject 
{
    private IMyInterface actualDataObject;
}

. . .

public class ViewModel
{
    public ObservableCollection<IMyInterface> MyData { get; }

    public void LoadData()
    {
        // concrete IMyInterface dtos are returned here, and put into a VM collection
        IList<IMyInterface> myData = 
            (from IMyInterface o in SomeDataSource.LoadLocalDescriptors() 
             select new ModelObject(o) as IMyInterface).ToList();
        this.MyData = new ObservableCollection<IMyInterface>(myData);
    }
}
//一些接口定义,用于示例完整性
公共接口IMyInterface
{
公共字符串MyProperty{get;set;}
}
//模型对象,它不直接实现IMyInterface,尽管接口是由PostSharp动态引入的
[ComposeObjectAspect(typeof(IMyInterface))]
公共类模型对象
{
私有imy接口实际数据对象;
}
. . .
公共类视图模型
{
公共ObservableCollection MyData{get;}
公共void LoadData()
{
//这里返回具体的IMyInterface DTO,并将其放入VM集合中
IList myData=
(来自SomeDataSource.LoadLocalDescriptors()中的IMyInterface o)
选择新模型对象(o)作为IMyInterface.ToList();
this.MyData=新的ObservableCollection(MyData);
}
}
这一切都很好,如果我检查myData列表中的任何对象,或者将其转换为IMyInterface类型(正如您在上面的类ModelObject定义中看到的,它没有直接实现),我可以直接从actualDataObject中看到内部属性。这一切都很好

现在,当我尝试将ViewModel.Data collection绑定到WPF datagrid时,会出现一系列绑定错误,如

System.Windows.Data错误:40:BindingExpression路径错误:“在对象”“模型对象”(HashCode=56810243)上找不到SomeProperty”属性。BindingExpression:Path=SomeProperty;DataItem='ModelObject'(HashCode=56810243);目标元素为“TextBlock”(名称=“”);目标属性为“Text”(类型为“String”)

作为参考,视图XAML的相关部分如下所示

<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Width="Auto" Header="Some Property" Binding="{Binding SomeProperty, Mode=OneWay}" />
    </DataGrid.Columns>
</DataGrid>

虽然所有数据行都可见(且为空),但显示为空的是网格列

如果我检查'ModelObject',属性IMyInterface.SomeProperty就在那里

如果我直接将IMyInterface应用于ModelObject类(并将所有成员作为简单的中继应用于组合的actualDataObject实例),那么绑定就可以了,并且SomeProperty显示没有错误

IMyInterface的PostSharp实现和我自己的显式版本之间有什么不同之处?可能的解决方案:

<DataGrid DataContext="{Binding Data}" ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Width="Auto" Header="Some Property" Binding="{Binding SomeProperty, Mode=OneWay}" />
    </DataGrid.Columns>
</DataGrid>


我在这里找到了这个问题的解决方案:

如果绑定是显式地针对接口类型定义的,而不是隐式地定义的,那么绑定将起作用,这可能是因为ModelObject没有SomeProperty,但它有IMyInterface.SomeProperty

所以,这是可行的

<DataGridTextColumn Width="Auto" Header="Some Property" 
       Binding="{Binding Path=(mynamespace:IMyInterface.SomeProperty), Mode=OneWay}" />


不过,正如参考问题中所述,它确实会引起设计器警告。

我认为原因是PostSharp引入了显式实现,因此实际上没有引入公共属性。你应该使用[IntroductionInterface]建议和[IntroductionMember]建议来介绍公共财产。

Hmm。。有趣。你能发布你的xaml吗?@Robin;完成了,尽管这很简单;没有什么异常。ViewModel上的“MyData”属性@sa_ddam213-在哪里?它设置为视图的DataContext。我的样本打错了,已经更正了。我怀疑这是否相关,因为当ModelObject类更改为显式实现带有组合的接口并传递到内部属性时,绑定会起作用。这一切归结为显式实现的接口,与postsharp无关,这就是它所做的。我不知道这项更改希望实现什么,但我尝试了它-结果是一样的。MyData应该有{get;set:}吗?不,这同样不相关,因为问题是显示,并且与row对象的绑定是单向的。查看错误BindingExpression路径错误:“ModelObject”中找不到“SomeProperty”属性,因此path=actualDataObject.SomeProperty应该解析,但不应该解析,因为actualDataObject是该类型的私有成员,我无论如何也不希望这样,因为它会与我的模型对象的内部产生过紧的耦合。
<DataGridTextColumn Width="Auto" Header="Some Property" 
       Binding="{Binding Path=(mynamespace:IMyInterface.SomeProperty), Mode=OneWay}" />