Привязка wpf из FindAncestor к свойству Dependency пользовательского элемента управления - PullRequest
0 голосов
/ 17 декабря 2009

У меня есть пользовательский элемент управления WPF с DependencyProperty MyString

Я использую элемент управления в ItemsControl на моем View и хочу получить значение из ViewModel.

Поскольку DataContext элемента управления становится каждым элементом в ItemsSource элемента ItemsControl, я подумал, что просто смогу использовать FindAncestor, но, похоже, он не работает ... Может кто-нибудь увидеть, где я ошибаюсь, пожалуйста?

Вот XAML на виде ...

<Grid>
    <ItemsControl ItemsSource="{Binding MyItems}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Name="myStack">
                    <ImportExceptions:ControlStrip MyString="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.MyStringOnViewModel}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>

    </ItemsControl>
</Grid>

и вот код моего пользовательского элемента управления, в котором я установил свойство зависимости ...

public partial class ControlStrip
{

    public ControlStrip()
    {
        InitializeComponent();
    }

    public string MyString
    {
        get
        {
            return GetValue(MyStringProperty).ToString();
        }
        set
        {
            SetValue(MyStringProperty, value);
        }
    }

    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.RegisterAttached("MyString", typeof (string), typeof (ControlStrip));


}

Ответы [ 2 ]

3 голосов
/ 17 декабря 2009

DataContext элемента управления не изменяется - DataContext для ImportExceptions:ControlStrip будет (если не указано явно) следующим доступным DataContext, так как он идет вверх по визуальному дереву ...

Из вашего кода я делаю вывод, что вы установили DataContext для View для ViewModel со свойствами «MyItems» и «MyStringOnViewModel» - вы должны иметь возможность просто привязать свойство MyString непосредственно к ViewModel, например

<ImportExceptions:ControlStrip MyString="{Binding Path=MyStringOnViewModel}" />
1 голос
/ 17 декабря 2009

Ваш код выглядит нормально. Возможно, вы допустили ошибку в ссылке на DataContext. По всей вероятности, DataContext для ItemsControl уже является MyStringOnViewModel. Таким образом, опустите .MystringOnViewModel после DataContext в атрибуте Path. Если нет, можете ли вы дать еще немного кода, или напишите об упрощении, которое имитирует, как заданы / заданы текст (ы) DataCon?

...