Связывание получает старое значение из ниоткуда - PullRequest
2 голосов
/ 22 октября 2019

У меня есть элемент управления, который наследуется от TextBox и имеет 2 дополнительных свойства строки: Formula и FormulaResult (только для чтения):

public class SpreadsheetCellControl : TextBox, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };


    public string Formula
    {
        get;
        set;
    }
    public string FormulaResult
    {
        get
        {
            if (Formula != null && Formula != "")
            {
                string formula = Formula;
                formula = formula.StartsWith("=") ? formula.Substring(1) : formula;
                var calculation = Calculator.Calculate(formula);
                return calculation.Result.ToString();
            }
            else return "";
        }
    }

    protected override void OnPreviewLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        Formula = Text;
        base.OnPreviewLostKeyboardFocus(e);
    }
}

Как определено в XAML, текст привязывается к формуле, когда элемент управления сфокусировани FormulaResult, когда он не сфокусирован:

<Style TargetType="local:SpreadsheetCellControl" BasedOn="{StaticResource HoverableStyle}">
        <Setter Property="VerticalContentAlignment" Value="Center"/>

        <Setter Property="Text" Value="{Binding RelativeSource={RelativeSource self}, Path=FormulaResult, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>

        <Style.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="BorderThickness" Value="2" />
                <Setter Property="BorderBrush" Value="Black" />
                <Setter Property="Text" Value="{Binding Formula, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            </Trigger>

        </Style.Triggers>
    </Style>

Все работает как надо. Например, я щелкаю элемент управления, набираю, например, «1/2», щелкаю где-нибудь еще, и на нем отображается «0,5».

Затем я устанавливаю свойство Formula с выделенным кодом на «3» (любое значениефактически). Прежде чем я щелкну на элементе управления, он показывает все три свойства правильно: 3, 3 и 3. Но когда я нажимаю на элемент управления, свойство Text внезапно становится старым «1/2», которое нигде не сохраняется. Я проверил это, поместив TextBlock и связав его Text со всеми тремя значениями элемента управления ячейкой. Отладка также показала только новые значения.

PS Также «Формула», по-видимому, сама по себе не принимает значения из «Текста»: Setter Property="Text" Value="{Binding Formula, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

1 Ответ

2 голосов
/ 22 октября 2019

Отсутствует привязка в параметре свойства Text внутри триггера RelativeSource Self:

<Setter Property="Text"
        Value="{Binding Path=Formula,
                        RelativeSource={RelativeSource Self},
                        Mode=TwoWay,
                        UpdateSourceTrigger=PropertyChanged}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...