Привязка ресурса к модели представления - PullRequest
1 голос
/ 16 февраля 2011

Как связать данные из модели представления в объект в ресурсах пользовательского элемента управления? Вот очень абстрактный пример:

<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}"/>

Но это не работает.

Edit:

GroupProvider расширяет DependencyObject, а GroupValue - это имя DependencyProperty. Я получаю следующую ошибку:

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 ]

1 голос
/ 30 июня 2015

Я знаю, что немного поздно, но у меня была та же проблема.Ответ Рика верный, вам нужно наследовать от 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>

Моя модель представления связана с DataContext из 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();
    }
}

К сожалению, я не знаю, почему это должно быть Freezable.

0 голосов
/ 16 февраля 2011

Чтобы включить привязку, GroupingProvider должно быть получено из Freezable или FrameworkElement или FrameworkContentElement, а GroupValue должно быть DependencyProperty.

...