c#uwp textblock text属性在运行时不更新UI

时间:2018-03-12 16:14:04

标签: c# listview mvvm uwp sum

我从组合框中选择一个项目来过滤项目的列表视图。这些项目包含值,并根据过滤器选择显示在视图中。

<ComboBox  Name="YearComboBox" ItemsSource="{x:Bind StudentEnrollment.Years, Mode=OneWay}" SelectedValue="{x:Bind StudentEnrollment.SelectedYear, Mode=TwoWay}”/>

<ListView ItemsSource="{x:Bind StudentEnrollment.FilteredStudentEnrollments, Mode=OneWay}"  SelectedIndex="{x:Bind StudentEnrollment.SelectedIndex, Mode=TwoWay}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="viewModels:StudentViewModel" >
                    <StackPanel Orientation="Horizontal">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{x:Bind Score01, Mode=OneWay}"/>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

public class StudentEnrollmentViewModel : NotificationBase
{
    StudentEnrollment StudentEnrollment;

    public StudentEnrollmentViewModel()
    {

    }

    private ObservableCollection<StudentEnrollmentViewModel> _StudentEnrollments;
    public ObservableCollection<StudentEnrollmentViewModel> StudentEnrollments
   {
        get { return _StudentEnrollments; }
        set
        {
            SetProperty(ref _StudentEnrollments, value);
        }
    }


    private ObservableCollection<StudentEnrollmentViewModel> _FilteredStudentEnrollments;
    public ObservableCollection<StudentEnrollmentViewModel> FilteredStudentEnrollments
    {
        get { return _FilteredStudentEnrollments; }
        set
        {
            SetProperty(ref _FilteredStudentEnrollments, value);
        }
    }

    private string _selectedYear;
    public string SelectedYear
    {
        get
        {
            return _selectedYear;
        }
        set { SetProperty(ref _selectedYear, value);
            { RaisePropertyChanged(SelectedYear); }
            RefreshFilteredStudentEnrollmentData(); }
    }

    private double _Score01;
    public double Score01
    {
        get
        {
            _Score01 = FilteredStudentEnrollments.Where(y => y.Year == SelectedYear).Select(s => s.Score01).Sum();
            return _Score01;
        }
    }

    private void RefreshFilteredStudentEnrollmentData()
    {
        var se = from seobjs in StudentEnrollments
                  where seobjs.Year == SelectedYear
                  select seobjs;

       if (FilteredStudentEnrollments.Count == se.Count()) || FilteredStudentEnrollments == null
       return;

        FilteredStudentEnrollments = new ObservableCollection<StudentEnrollmentViewModel>(se);
    }

正如预期的那样,我可以对过滤后的值求和,并在页面加载时在每个列表视图列的TextBlock文本属性中显示总数。

        <TextBlock Text="{x:Bind StudentEnrollment.Score01, Mode=OneWay}"/>

问题是Textblock UI不会通过组合框选择更新/显示viewmodel中的更改属性值。我确定我错过了一些东西,或者有一些倒退的逻辑,希望一些新鲜的眼睛可以提供帮助。

1 个答案:

答案 0 :(得分:0)

我不确定哪个类是哪个,因为StudentEnrollmentViewModelStudentViewModel之间似乎有些混淆,但我想我看到了问题的原因。

Score01属性是一个get-only属性(实际上你可以删除_Score01字段并返回值)。其值取决于FilteredStudentEnrollmentsSelectedYear属性。但UI不知道这一点,所以当这些属性发生变化时,你必须通知它,它应该绑定一个新值Score01

private ObservableCollection<StudentEnrollmentViewModel> _FilteredStudentEnrollments;
public ObservableCollection<StudentEnrollmentViewModel> FilteredStudentEnrollments
{
    get { return _FilteredStudentEnrollments; }
    set
    {
        SetProperty(ref _FilteredStudentEnrollments, value);
        RaisePropertyChanged("Score01");
    }
}

private string _selectedYear;
public string SelectedYear
{
    get
    {
        return _selectedYear;
    }
    set 
    { 
       SetProperty(ref _selectedYear, value);
       RaisePropertyChanged("Score01");
       RefreshFilteredStudentEnrollmentData();
    }
}

public double Score01
{
    get
    {
        return FilteredStudentEnrollments.
            Where(y => y.Year == SelectedYear).Select(s => s.Score01).Sum();            
    }
}

注意我已将RaisePropertyChanged调用更改为传递"Score01",因为该方法需要该属性的名称,而您之前传递的是SelectedYear属性的值,意味着为PropertyChanged而不是属性本身执行2018事件。另请注意,SetProperty方法也在内部调用RaisePropertyChanged SelectedYear属性。

相关问题