我想问一下,当对“binding
”类型的对象进行绑定时,WPF是否具有可以在object
上定义目标类型的任何功能。我有一个类型为“object
”的泛型集合,必须在其各种绑定点处理为一个对象类型或另一个(即。DateTime
,int
等)。 / p>
有没有什么方法可以随意强制.Net框架在编译时将未知类型的对象作为Type_X
的对象处理,在处理绑定时会根据具体情况进行处理?
答案 0 :(得分:5)
当然,您可以使用DataTemplates
。如果您在App.xaml中定义它们,它们将全局应用:
<DataTemplate DataType="{x:Type local:YourType}">
<TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/>
</DataTemplate>
现在,只要在UI中的某个位置添加运行时类型YourType
的对象,就像在StackPanel
中一样,就会使用该模板。
答案 1 :(得分:2)
不,Binding
课程不提供任何此类功能;实际上它不需要,Binding框架自动将源对象转换为相关类型并使用bound属性值,否则如果找不到该属性则引发绑定错误。
因此,如果我的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
的公共属性,则绑定将执行else将发生绑定错误(在输出窗口中只有错误信息没有例外)。
现在,如果我想将Dummy
属性设置为两种不同类型的对象(一种具有Name
而另一种具有FirstName
),那么我有两种选择 -
DataTemplates
定义为Botz300建议ValueConverter
(检查对象类型并返回相关的属性值)。 使用ValueConverter
的另一个变体是定义要进行转换的TypeConverter
并使用TypeConverterAttribute
声明它,然后在绑定中自动转换将完成。
同样适用于对象的收集。
<强>更新强>
是的,WPF会隐式使用DefaultType
转换器将您的类型转换为相关的显示值。如果您将Object
直接绑定到属性(上例中为Text
),则WPF将使用该TypeConverter
类型(如果可用)或使用ToString()
方法获取显示值。
但所有这些都取决于您用于显示数据的控件以及您绑定的方式/内容。
注意:此技巧仅适用于可以简单的对象 文本表示。使用它可能没有意义 处理复杂数据对象时的便捷技术。
你可以在MSDN上讨论这篇文章 - Customize Data Display with Data Binding and WPF
答案 2 :(得分:0)
也许你可以用d:DataContext设置一个设计时DataContext - 如果你只想让你的IDE知道它有什么样的数据。
<ContextMenu ItemsSource="{Binding Shapes}"
DataContext="{Binding Data, Source={StaticResource BindingProxy}}"
d:DataContext="{d:DesignInstance tree:DesktopViewModel}">
[items...]
</ContextMenu>
我有一个ContextMenu,它从BindingProxy(它具有object类型的Data-Property)获取它的DataContext。要使VS和Resharper正常工作,他们必须知道DataContext的类型,所以我只需定义一个设计时DataContext,现在他们知道它是DesktopViewModel
。
这只适用于DataContext,而不是任何绑定(因为没有DesignTimeBinding这样的东西),但也许你可以重写你的绑定来引用那个DataContext(或者将你的控件包装在一个网格中DataContext和d:DataContext)。
答案 3 :(得分:0)
我不确定这是否正是您要查找的内容,但是您可以在绑定的Path
属性中指定类型,方法是在属性名称中加上括号并添加<Type>.
在前。
示例:
<ContextMenu Tag="{Binding Path=PlacementTarget.(FrameworkElement.Tag), RelativeSource={RelativeSource Self}}">
...
</ContextMenu>
这指定属性Tag
是FrameworkElement
类型的成员,并指示PlacementTarget
是该类型。