Silverlight. Как обновить текстовое поле, связанное с IValueConverter, при изменении значений в сущности? - PullRequest
0 голосов
/ 12 марта 2011

Итак, у меня есть DataGrid с TextBlock, который отображает совокупное значение двух текстовых полей в сетке. Я делаю это, связывая, используя конвертер значений. Это работает на нагрузку, но мне нужно обновить его при изменении значений других объектов, которые его агрегируют. Вот мой код:

Вот мой PagedCollectionView в моей ViewModel, который привязан к представлению.

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();
    }
}

Итак, после изменения значений в двух других текстовых полях мне нужно обновить обновленное значение в текстовом блоке. Как я могу сделать это? Сейчас я в растерянности и, просматривая веб-страницы, я не смог найти никаких решений.

Спасибо большое, Evan

Ответы [ 3 ]

1 голос
/ 12 марта 2011

Эван, Колин Эберхардт имеет интересное так называемое решение "MultiBinding" в своем блоге и делает что-то очень похожее.

"MultiBinding - это функция WPF, которая позволяет вампривязать одно свойство к нескольким источникам, причем исходные значения объединяются конвертером значений. Эта функция отсутствует в Silverlight "(Цитата)

Это должно решить вашу проблему.С наилучшими пожеланиями!

1 голос
/ 12 марта 2011

Почему бы вам не привязать 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>
0 голосов
/ 06 декабря 2011

попробуйте вызвать OnApplyTemplate
например. grid.OnApplyTemplate ()

...