У меня есть элемент управления, который наследуется от 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}"