簡體   English   中英

c#uwp textblock文本屬性在運行時未更新UI

[英]c# uwp textblock text property not updating UI during runtime

我正在從組合框中選擇一個項目以過濾項目的列表視圖。 這些項目包含值,並根據過濾器選擇顯示在視圖中。

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

不出所料,我可以對過濾后的值求和,並在頁面加載時在每個listview列的TextBlock文本屬性中顯示總計。

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

問題的是,Textblock UI不會通過組合框選擇在視圖模型中更新/顯示更改的屬性值。 我確定我缺少某些東西,或者有一些邏輯倒退,希望有些新鮮的眼睛可以有所幫助。

我不確定哪個是哪個類,因為StudentEnrollmentViewModelStudentViewModel之間似乎有些混淆,但是我認為我知道了問題的原因。

Score01屬性是僅獲取屬性(實際上,您可以刪除_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調用更改為RaisePropertyChanged"Score01" ,因為該方法期望該屬性的名稱,而您之前傳遞的是SelectedYear屬性的值,這意味着將對諸如2018之類的東西執行PropertyChanged事件而不是該屬性本身。 還要注意, SetProperty方法在內部RaisePropertyChangedSelectedYear屬性調用RaisePropertyChanged

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM