Контентконтроль не обновляет текст - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть вид, который содержит много входных параметров.Каждый параметр состоит из метки (имени параметра), текстового поля для его значения и другой метки для его единиц (например, кНм).

Панель управления отображается в горизонтальной панели стека.

При изменении текста (связывание ToWay) текстового поля базовое свойство (например, DesignLife) больше не обновляется, поскольку я переключился с прямого WPF (OnPropertyChanged) на MVVM Light (RaisePropertyChanged).

Вот некоторые соответствующие фрагменты кода:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace xxxx.Views.CustomControls
{   
    public class InputParameter : ContentControl
    {
        static InputParameter()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(InputParameter), new FrameworkPropertyMetadata(typeof(InputParameter)));
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }      
 // some properties left out
        public static readonly DependencyProperty TextProperty =
         DependencyProperty.Register("Text", typeof(string), typeof(InputParameter));
        public string Text
        {
            get => (string)GetValue(TextProperty);
            set => SetValue(TextProperty, value);
        }

    }
}

<UserControl
    x:Class="xxxx.Views.MainUserControls.Column"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cc="clr-namespace:xxxx.Views.CustomControls"
    xmlns:cf="clr-namespace:xxxx.Model.Config"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:tt="clr-namespace:xxxx.Properties"
    DataContext="{Binding Main.Calc, Source={StaticResource Locator}}"
    mc:Ignorable="d">
    <GroupBox Margin="3">

        <StackPanel Orientation="Vertical">

<!-- Stuff left out -->

            <cc:InputParameter
                NameContent="Design life"
                Text="{Binding DesignLife, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, StringFormat=N0}"                  
                UnitContent="years" />
<!-- Stuff left out -->

        </StackPanel>
    </GroupBox>
</UserControl>

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cc="clr-namespace:CoCa.Views.CustomControls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Style x:Key="InputParm" TargetType="{x:Type cc:InputParameter}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type cc:InputParameter}">
                    <StackPanel Style="{StaticResource SPanel}">

                        <Label
                            x:Name="PART_NameLabel"
                            Width="130"
                            HorizontalContentAlignment="Left"
                            Content="{TemplateBinding NameContent}"
                            Foreground="{TemplateBinding Foreground}"
                            Style="{StaticResource LabelStyle1}"
                            ToolTip="{TemplateBinding ToolTip}" />
                        <TextBox
                            x:Name="PART_TextBox"
                            Width="70"
                            Background="{TemplateBinding TbBackground}"
                            Foreground="{TemplateBinding Foreground}"
                            Style="{StaticResource Tb}"
                            Text="{TemplateBinding Property=Text}" />
                        <Label
                            x:Name="PART_UnitLabel"
                            Content="{TemplateBinding UnitContent}"
                            Foreground="{Binding ElementName=PART_NameLabel, Path=Foreground}"
                            Style="{StaticResource Unit}" />

                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

private int _designLife;    
public int DesignLife
{
    get => _designLife;

    set
    {
        Set<int>(() => DesignLife, ref _designLife, value, true);
    }
}

Я подозреваю, что RaisePropertyChanged не вызывается, потому что он не используется нигде в классе InputParameter Text DependencyProperty.(Может быть, под капотом это делает?)

Вопросы:

1: Способ, которым я сделал InputParameter, путь?

2: Правильно ли мое подозрение?

3 a: Если да, как мне вызвать RaisePropertyChanged?

b: Если нет: в чем может быть проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...