将资源绑定到视图模型

时间:2011-02-15 21:48:21

标签: wpf data-binding resources

如何将视图模型中的数据绑定到用户控件资源中的对象?这是一个非常抽象的例子:

<UserControl ... 
             xmlns:local="clr-namespace:My.Local.Namespace"
             Name="userControl">
    <UserControl.Resources>
        <local:GroupingProvider x:Key="groupingProvider" GroupValue="{Binding ???}" />
    </UserControl.Resources>

    <Grid>
        <local:GroupingConsumer Name="groupingConsumer1" Provider={StaticResource groupingProvider"} />
        <local:GroupingConsumer Name="groupingConsumer2" Provider={StaticResource groupingProvider"} />
    </Grid>
</UserControl>

如何将GroupValue绑定到此视图后面的视图模型中的属性。我尝试了以下内容:

<local:GroupingProvider x:Key="groupingProvider" GroupValue="{Binding ElementName=userControl, Path=DataContext.Property}"/>

但这不起作用。

修改

GroupProvider延伸DependencyObjectGroupValueDependencyProperty的名称。我收到以下错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext.Property; DataItem=null; target element is 'GroupingProvider' (HashCode=47478197); target property is 'GroupValue' (type 'TimeSpan')

这似乎表明找不到userControl

更多编辑

没人回答我的问题?有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

我知道它有点晚了,但我遇到了同样的问题。 Ricks答案是对的,你需要继承Freezable

以下代码给出了与您相同的错误

不工作资源:

public class PrintBarcodesDocumentHelper : DependencyObject
{
    public IEnumerable<BarcodeResult> Barcodes
    {
        get { return (IEnumerable<BarcodeResult>)GetValue(BarcodesProperty); }
        set { SetValue(BarcodesProperty, value); }
    }

    public static readonly DependencyProperty BarcodesProperty =
        DependencyProperty.Register("Barcodes", typeof(IEnumerable<BarcodeResult>), typeof(PrintBarcodesDocumentHelper), new PropertyMetadata(null, HandleBarcodesChanged));

    private static void HandleBarcodesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Do stuff
    }
}

的Xaml:

<UserControl.Resources>
    <Barcodes:PrintBarcodesDocumentHelper x:Key="docHelper" Barcodes="{Binding BarcodeResults}"/>
</UserControl.Resources>

我的viewmodel绑定到DataContext的{​​{1}}。

错误:

UserControl

工作资源类:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=BarcodeResults; DataItem=null; target element is 'PrintBarcodesDocumentHelper' (HashCode=55335902); target property is 'Barcodes' (type 'IEnumerable`1')

不幸的是我不知道为什么它必须是public class PrintBarcodesDocumentHelper : Freezable { // Same properties protected override Freezable CreateInstanceCore() { return new PrintBarcodesDocumentHelper(); } }

答案 1 :(得分:0)

为了启用绑定,GroupingProvider需要从FreezableFrameworkElementFrameworkContentElement派生,GroupValue需要DependencyProperty }。