В модели MVVM мой взгляд использует конвертер значений. Этот преобразователь значений имеет свойство X, которое влияет на преобразованное значение. Это свойство X может измениться
Всякий раз, когда X изменяется, все значения, которые были преобразованы с помощью этого преобразователя значений, должны быть обновлены. Конечно, моя ViewModel не знает, что мои представления используют этот конвертер, поэтому не может уведомить PropertyChanged. Кроме того, я думаю, что не стоит опровергать ViewModel, в какой формат преобразуются значения.
Мой преобразователь значений не знает, для каких значений он используется. К счастью, мой XAML и его код, стоящий за классом, делают.
Итак, мое представление имеет два конвертера в качестве ресурсов и два текстовых блока, которые используют эти ресурсы:
MyView.XAML:
<UserControl.Resources>
<convert:FormattedStringConverter x:Key="SelectedHistoryConverter" />
<vm:TimeFrameConverter x:Key="TimeFrameConverter"/>
</UserControl.Resources>
...
<TextBlock Height="20" Name="HistoryTime"
Text="{vm:CultureInfoBinding Path=SelectedHistoryTime,
Converter= {StaticResource SelectedHistoryConverter},
ConverterParameter='History Time: {0:G}'}"/>
<TextBlock Height="20" Name="Timeframe"
Text="{vm:CultureInfoBinding Path=Timeframe,
Converter= {StaticResource TimeFrameConverter},
ConverterParameter='Time Frame: [{0:G}, {1:G}]'}"/>
Обработчик событий в MyView.XAML.cs
private void OnMyParameterChanged(object sender, EventArgs e)
{
UpdateConverterParameters(); // updates the changed property in the converters
UpdateTargets(); // forces an Update of all Targets that use these converters
}
В UpdateTargets мне нужно указать двум TextBlocks обновить их значения, которые будут использовать измененные конвертеры.
Для этого я использовал принятый ответ в StackOverflow: Как заставить привязку WPF к refre sh?
public void UpdateTargets()
{
BindingExpression historyTimeExpression = HistoryTime.GetBindingExpression(TextBlock.TextProperty);
historyTimeExpression.UpdateTarget();
BindingExpression timeframeExpression = Timeframe.GetBindingExpression(TextBlock.TextProperty);
timeframeExpression .UpdateTarget();
}
Это прекрасно работает. Однако это означает, что всякий раз, когда я добавляю элемент в XAML, который использует эту привязку, мне придется добавлять этот элемент в UpdateTargets.
Есть ли способ для класса, производного от Binding, узнать, какие цели связаны с ним