我想问一下 WPF 是否有任何功能,binding
当绑定到“ object
”类型的对象时,可以通过它在 a 上定义目标类型。我有一个类型为 " object
" 的通用集合,它必须在其各个绑定点作为一种对象类型或另一种对象类型(即DateTime
、int
等)处理。
Type_X
在处理绑定时,有什么方法可以任意强制.Net框架在编译时将未知类型的对象视为对象?
当然,您可以使用DataTemplates
. 如果您在 App.xaml 中定义它们,它们将被全局应用:
<DataTemplate DataType="{x:Type local:YourType}">
<TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/>
</DataTemplate>
YourType
现在,每当您在 UI 中的某处添加运行时类型的对象时,例如在 aStackPanel
中,都会使用该模板。
不,Binding
类不提供任何此类功能;其实不需要,Binding 框架会自动将源对象转换为相关类型并使用绑定的属性值,否则如果找不到该属性会引发绑定错误。
所以如果我有一个Object
类型的属性ViewModel
public object Dummy
{
get
{
return dummy;
}
set
{
dummy = value;
NotifyPropertyChanged("Dummy");
}
}
我把它绑定到TextBox
这样的 -
<TextBox Text="{Binding Dummy.Name}" HorizontalAlignment="Stretch"/>
然后将 Dummy 设置为这样的对象 -
Dummy = new MyCustomType();
此时,绑定将评估并尝试Name
在源对象(Dummy
)中找到该属性,如果MyCustomType
定义了一个名为的公共属性Name
,则绑定将执行,否则将发生绑定错误(没有例外,只是输出窗口中的错误消息)。
现在,如果我想将我的Dummy
属性设置为两种不同类型的对象(一种具有Name
,另一种具有FirstName
),那么我有两个选择 -
DataTemplates
为建议的 Botz300ValueConverter
(检查对象类型并返回相关属性值)。using 的另一个变体ValueConverter
是定义一个TypeConverter
to do 转换并用 声明它TypeConverterAttribute
,然后在绑定中自动转换将完成。
同样适用于对象的集合。
更新:
是的,WPF 将隐式使用DefaultType
转换器将您的类型转换为相关的显示值。如果您将Object
直接绑定到属性(Text
在上面的示例中),则 WPF 将使用该TypeConverter
类型(如果可用)或使用该ToString()
方法获取显示值。
但这一切都取决于您用于显示数据的控件以及您绑定的方式/内容。
注意:此技巧仅适用于可以具有简单文本表示的对象。在处理复杂的数据对象时,使用这种方便的技术可能没有意义。
您可以阅读 MSDN 上的这篇文章,其中讨论了这个 - 使用数据绑定和 WPF 自定义数据显示
也许您可以使用 d:DataContext 设置设计时 DataContext - 如果您只想让您的 IDE 知道它需要什么样的数据。
<ContextMenu ItemsSource="{Binding Shapes}"
DataContext="{Binding Data, Source={StaticResource BindingProxy}}"
d:DataContext="{d:DesignInstance tree:DesktopViewModel}">
[items...]
</ContextMenu>
我有一个 ContextMenu,它从 BindingProxy (具有对象类型的数据属性)获取它的 DataContext。为了让 VS 和 Resharper 正常工作,他们必须知道 DataContext 的类型,所以我只需定义一个设计时 DataContext,现在他们知道它是一个DesktopViewModel
.
这仅适用于 DataContext,不适用于任何绑定(因为没有 DesignTimeBinding 之类的东西),但也许您可以重写绑定以引用该 DataContext(或将控件包装在具有 DataContext 和 d:DataContext 的网格中) .
我不确定这是否正是您要查找的内容,但是您可以Path
通过用括号括住属性名称并<Type>.
在前面添加来指定绑定属性中的类型。
例子:
<ContextMenu Tag="{Binding Path=PlacementTarget.(FrameworkElement.Tag), RelativeSource={RelativeSource Self}}">
...
</ContextMenu>
这指定该属性Tag
是该FrameworkElement
类型的成员并指示该属性属于PlacementTarget
该类型。