Почему пользовательское свойство в UserControl не устанавливается, когда элемент управления используется в DataTemplate? - PullRequest
5 голосов
/ 18 августа 2010

У меня есть UserControl, который имеет пользовательский DependencyProperty.Когда я использую UserControl из DataTemplate, я не могу установить значение DependencyProperty.Если я использую UserControl прямо в окне, то DependencyProperty работает нормально.Я прошу прощения за длинный пост, я упростил код до минимума, который все еще показывает проблему, с которой я столкнулся в своем проекте.Спасибо за любую помощь, я не знаю, что еще попробовать.

Главное окно XAML:

<Window ...>
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:TextVM}">
            <local:TextV MyText="I do not see this"/> <!--Instead I see "Default in Constructor"-->
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Border BorderThickness="5" BorderBrush="Black" Width="200" Height="100" >
            <StackPanel>
                <ContentControl Content="{Binding Path=TheTextVM}"/>
                <local:TextV MyText="I see this"/>
            </StackPanel>
        </Border>
    </Grid>
</Window>

Главное окно Код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        TheTextVM = new TextVM();
    }

    public TextVM TheTextVM { get; set; }
}

UserControl XAML:

<UserControl ...>
    <Grid>
        <TextBlock x:Name="textBlock"/>
    </Grid>
</UserControl>

Код контроля пользователя:

public partial class TextV : UserControl
{
    public TextV()
    {
        InitializeComponent();
        MyText = "Default In Constructor";
    }

    public static readonly DependencyProperty MyTextProperty =
       DependencyProperty.Register("MyText", typeof(string), typeof(TextV),
       new PropertyMetadata("", new PropertyChangedCallback(HandleMyTextValueChanged)));

    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }

    private static void HandleMyTextValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
    {
        TextV tv = d as TextV;
        if(tv != null) tv.textBlock.Text = args.NewValue.ToString();
    }
}

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Значение, установленное в коде, имеет более высокий приоритет, чем любое значение, установленное в XAML.

Вместо этого вам следует переопределить значение по умолчанию в производном типе .

2 голосов
/ 18 августа 2010

Я могу воспроизвести проблему, но я понятия не имею, что ее вызывает ... Очевидно, это работает, если вы удалите инициализацию из конструктора.Если значение по умолчанию является константой, ваш лучший вариант - использовать его в качестве значения по умолчанию свойства зависимостей, а не устанавливать его в конструкторе.

В любом случае, что вы пытаетесь сделать точно?Разве это не может быть достигнуто привязкой к ViewModel?

...