Silverlight:如何在更改实体中的值时更新IValueConverter绑定的文本框?

时间:2011-03-11 21:08:56

标签: silverlight data-binding datagrid ria ivalueconverter

所以,我有一个带有TextBlock的DataGrid,它显示网格中两个文本框的聚合值。我通过使用值转换器绑定来完成此操作。这适用于负载,但我需要它在更改其聚合的其他实体的值时进行更新。以下是我的一些代码:

这是我的ViewModel中的PagedCollectionView,它绑定到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();
    }
}

因此,在更改其他2个文本框中的值时,我需要它来刷新文本块中的聚合值。我怎么能做到这一点?我现在不知所措,浏览网页我找不到任何解决方案。

非常感谢, 埃文

3 个答案:

答案 0 :(得分:1)

为什么不将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>

答案 1 :(得分:1)

Evan,Colin Eberhardt在他的博客上有一个有趣的所谓"MultiBinding" solution,并且正在做一些非常相似的事情。

  

“MultiBinding是一个WPF功能   允许您绑定单个属性   对于许多来源,与   源值由a组合   价值转换器。这是一个功能   Silverlight中缺少的“   (行情)

这应该可以解决您的问题。最好的问候!

答案 2 :(得分:0)

尝试调用OnApplyTemplate
例如。 grid.OnApplyTemplate()