3

我想问一下 WPF 是否有任何功能,binding当绑定到“ object”类型的对象时,可以通过它在 a 上定义目标类型。我有一个类型为 " object" 的通用集合,它必须在其各个绑定点作为一种对象类型或另一种对象类型(即DateTimeint等)处理。

Type_X在处理绑定时,有什么方法可以任意强制.Net框架在编译时将未知类型的对象视为对象?

4

4 回答 4

6

当然,您可以使用DataTemplates. 如果您在 App.xaml 中定义它们,它们将被全局应用:

<DataTemplate DataType="{x:Type local:YourType}">
    <TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/>
</DataTemplate>

YourType现在,每当您在 UI 中的某处添加运行时类型的对象时,例如在 aStackPanel中,都会使用该模板。

于 2012-06-22T08:34:50.597 回答
2

不,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),那么我有两个选择 -

  1. 定义DataTemplates为建议的 Botz300
  2. 使用 a ValueConverter(检查对象类型并返回相关属性值)。

using 的另一个变体ValueConverter是定义一个TypeConverterto do 转换并用 声明它TypeConverterAttribute,然后在绑定中自动转换将完成。

同样适用于对象的集合。

更新:

是的,WPF 将隐式使用DefaultType转换器将您的类型转换为相关的显示值。如果您将Object直接绑定到属性(Text在上面的示例中),则 WPF 将使用该TypeConverter类型(如果可用)或使用该ToString()方法获取显示值。

但这一切都取决于您用于显示数据的控件以及您绑定的方式/内容。

注意:此技巧仅适用于可以具有简单文本表示的对象。在处理复杂的数据对象时,使用这种方便的技术可能没有意义。

您可以阅读 MSDN 上的这篇文章,其中讨论了这个 - 使用数据绑定和 WPF 自定义数据显示

于 2012-06-22T11:01:38.287 回答
2

也许您可以使用 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 的网格中) .

于 2014-12-08T12:33:09.847 回答
2

我不确定这是否正是您要查找的内容,但是您可以Path通过用括号括住属性名称并<Type>.在前面添加来指定绑定属性中的类型。

例子:

<ContextMenu Tag="{Binding Path=PlacementTarget.(FrameworkElement.Tag), RelativeSource={RelativeSource Self}}">
...
</ContextMenu>

这指定该属性Tag是该FrameworkElement类型的成员并指示该属性属于PlacementTarget该类型。

于 2019-06-27T01:19:33.537 回答