【问题标题】:c# uwp textblock text property not updating UI during runtimec# uwp textblock text 属性在运行时不更新UI
【发布时间】:2018-08-20 17:52:00
【问题描述】:

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

<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 不会通过组合框选择更新/显示视图模型中不断变化的属性值。我确定我错过了一些东西,或者有一些逻辑倒退,希望一些新的眼睛可以提供帮助。

【问题讨论】:

    标签: c# listview mvvm uwp sum


    【解决方案1】:

    我不确定哪个类是哪个,因为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 方法在内部也会为 SelectedYear 属性调用 RaisePropertyChanged

    【讨论】:

    • 非常感谢您的帮助和澄清。这解决了问题,我的绑定现在按预期更新。
    • 很高兴为您提供帮助!如果它解决了您的问题,请考虑将答案标记为解决方案,以便问题得到解决:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2023-04-06
    • 1970-01-01
    • 2020-02-11
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多