显式设置WPF绑定数据类型

时间:2012-06-22 08:07:48

标签: c# .net wpf binding types

我想问一下,当对“binding”类型的对象进行绑定时,WPF是否具有可以在object上定义目标类型的任何功能。我有一个类型为“object”的泛型集合,必须在其各种绑定点处理为一个对象类型或另一个(即。DateTimeint等)。 / p>

有没有什么方法可以随意强制.Net框架在编译时将未知类型的对象作为Type_X的对象处理,在处理绑定时会根据具体情况进行处理?

4 个答案:

答案 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),那么我有两种选择 -

  1. DataTemplates定义为Botz300建议
  2. 使用ValueConverter(检查对象类型并返回相关的属性值)。
  3. 使用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>

这指定属性TagFrameworkElement类型的成员,并指示PlacementTarget是该类型。