Silverlight. Как обновить текстовое поле, привязанное к IValueConverter, при изменении значений в сущности?
Итак, у меня есть DataGrid с TextBlock, который отображает совокупное значение двух текстовых полей в сетке. Я делаю это путем привязки с помощью конвертера значений. Это работает с нагрузкой, но мне нужно обновить его при изменении значений других объектов, которые его агрегируют. Вот часть моего кода:
Вот мой PagedCollectionView в моем ViewModel, который связан с View.
private PagedCollectionView _grievances;
public PagedCollectionView Grievances
{
get
{
if (_grievances == null)
{
_grievances = new PagedCollectionView(Context.lict_grievances);
_grievances.SortDescriptions.Add(new SortDescription("grievance_type_id", ListSortDirection.Ascending));
}
return _grievances;
}
}
Вот моя DataGrid в моем представлении:
<sdk:DataGrid x:Name="grdGrievances" AutoGenerateColumns="False" ItemsSource="{Binding Path=Grievances}" HorizontalContentAlignment="Center">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Total # of Outcomes">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource GrievanceOutcomeSum}}" Margin="15,0,0,0"></TextBlock>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Resolved">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=outcome_resolved, Mode=TwoWay}"
TextChanged="ResolvedTextBox_TextChanged" HorizontalAlignment="Center"></TextBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Pending">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=outcome_pending, Mode=TwoWay}"></TextBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
Вот мой конвертер значений для агрегированного текстового блока:
public class GrievancesAggregateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
lict_grievance entity = (lict_grievance)value;
short i = 0;
if (entity != null)
{
if (entity.outcome_resolved != null)
i += (short)entity.outcome_resolved;
if (entity.outcome_pending != null)
i += (short)entity.outcome_pending;
}
return i;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
Итак, после изменения значений в двух других текстовых полях мне нужно обновить обновленное значение в текстовом блоке. Как я могу сделать это? Сейчас я в растерянности и, просматривая веб-страницы, я не смог найти никаких решений.
Большое спасибо, Эван
3 ответа
Эван, Колин Эберхардт имеет интересное так называемое решение "MultiBinding" в своем блоге и делает нечто очень похожее.
"MultiBinding - это функция WPF, которая позволяет привязывать одно свойство к нескольким источникам, причем исходные значения объединяются конвертером значений. Эта функция отсутствует в Silverlight" (Цитата)
Это должно решить вашу проблему. С наилучшими пожеланиями!
Почему бы вам не привязать TextBlock (общее количество результатов) к свойству, которое будет запускать PropertyChanged. Затем установите это значение из события ResolvedTextBox_TextChanged.
Попробуйте что-то вроде этого:
<StackPanel Orientation="Vertical">
<i:Interaction.Triggers>
<ei:PropertyChangedTrigger Binding="{Binding FirstTextBox}">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=textBlock}"
PropertyName="Text"
Value="{Binding Converter={StaticResource TestConverter}}" />
</ei:PropertyChangedTrigger>
<ei:PropertyChangedTrigger Binding="{Binding SecondTextBox}">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=textBlock}"
PropertyName="Text"
Value="{Binding Converter={StaticResource TestConverter}}" />
</ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
<TextBlock x:Name="textBlock" />
<TextBox x:Name="firstTextBox"
Text="{Binding FirstTextBox, Mode=TwoWay}" />
<TextBox x:Name="secondTextBox"
Text="{Binding SecondTextBox, Mode=TwoWay}" />
</StackPanel>
Попробуйте вызвать OnApplyTemplate
например. grid.OnApplyTemplate()