DependencyProperty для ViewModel UserControl не обновляется связыванием - PullRequest
1 голос
/ 30 января 2012

У меня есть UserControl, который используется в качестве основы для элементов в ItemsControl:

Главная страница xaml:

<ItemsControl ItemsSource="{Binding Systems, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:ServerGroupControl>
                <local:ServerGroupControl.DataContext>
                    <local:ServerGroupControlViewModel System="{Binding}"/>
                </local:ServerGroupControl.DataContext>
            </local:ServerGroupControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Я пытаюсь установить свойство 'System' каждой ViewModel (чтобы оно могло обрабатывать данные для представления), но свойство никогда не устанавливается!

Вот объявление свойства зависимости в классе модели представления:

    public static readonly DependencyProperty SystemProperty = DependencyProperty.Register(
        "System",
        typeof(ServerGroup),
        typeof(ServerGroupControlViewModel)
    );

    public ServerGroup System
    {
        get { return (ServerGroup)GetValue(SystemProperty); }
        set { SetValue(SystemProperty, value); }
    }

Свойство всегда сохраняет значение по умолчанию. Любые идеи о том, почему эта установка не работает?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Поэтому, основываясь на вашем комментарии, я бы заподозрил, что привязка не работает, потому что в месте, где вы пытаетесь выполнить привязку, нет DataContext.

Ваша виртуальная машина не является FrameworkElement, поэтому она имеетнет свойства DataContext, предположительно, оно также не Freezable (и, следовательно, может также отсутствовать контекст наследования), поэтому я подозреваю, что это не сработает.(Кстати, ElementName и RelativeSource тоже не будут работать)

Я предлагаю вам по-другому к этому подходить, также я не рекомендую использовать DP в виртуальных машинах из-за привязки к потоку и другихпроблемы.


Вот одна жемчужина обходного пути:

<DataTemplate>
    <local:ServerGroupControl Name="sgc">
        <local:ServerGroupControl.Resources>
            <local:ServerGroupControlViewModel x:Key="context"
                System="{Binding Parent.DataContext, Source={x:Reference sgc}}" />
        </local:ServerGroupControl.Resources>
        <local:ServerGroupControl.DataContext>
            <StaticResource ResourceKey="context" />
        </local:ServerGroupControl.DataContext>
    </local:ServerGroupControl>
</DataTemplate>

Да, пожалуйста, не делайте этого ...

0 голосов
/ 30 января 2012

Когда свойство устанавливается через привязку данных, явная функция установки не вызывается.

Если вы действительно хотите перехватить действие настройки, вы можете сделать это с помощью обратного вызова, который вы установили при инициализации свойства зависимости.

public static readonly DependencyProperty SystemProperty = DependencyProperty.Register(
        "System",
        typeof(ServerGroup),
        typeof(ServerGroupControlViewModel),
        new PropertyMetadata
        {
            PropertyChangedCallback = SystemPropertyChanged
        }
    );


static void SystemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ServerGroupControlViewModel receiver = (ServerGroupControlViewModel)d;
    ServerGroup newValue = e.NewValue as ServerGroup;

    // Add any appropriate handling logic here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...