Я пытаюсь создать страницу, на которой будет отображаться индикатор выполнения, пока данные не будут успешно загружены с сервера.
Для этого я использую общий загрузчик данных, который просто заполнит свойства модели и установит для свойства IsLoading значение true и / или false
Модели View выглядят так:
public class GenericPageModel: GenericModel
{
private bool _isLoading;
public bool IsLoading
{
get { return _isLoading; }
set
{
_isLoading = value;
OnPropertyChanged("IsLoading");
}
}
}
public class GenericModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
GenericPageModel используется на странице XAML в качестве модели, а свойство IsLoading используется ниже:
<Grid>
<Grid.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis"/>
</Grid.Resources>
<ProgressBar Height="25" Margin="5"
VerticalAlignment="Center" HorizontalAlignment="Stretch"
Visibility="{Binding IsLoading, Converter={StaticResource boolToVis}}"
IsIndeterminate="True"
/>
</Grid>
Загрузчик общих данных:
...
// Model that it's calling this
public object Model
{ get; set; }
private string _loadingProperty;
...
void _bw_DoWork(object sender, DoWorkEventArgs e)
{
// Set the is loading property
if (null != _loadingProperty)
{
//((Model as GenericModel).Owner as GenericPageModel).IsLoading = true; // Works!!
Model.GetType().GetProperty(_loadingProperty).SetValue(Model, true, null); // Doesn't work
}
}
Если я явно приведу Model к GenericPageModel и установил IsLoading в true, все будет работать нормально (см. Закомментированную строку)
Если я использую отражение, чтобы установить значение свойства, установщик IsLoading удаляется правильно, метод OnPropertyChanged вызывается нормально, но пользовательский интерфейс не обновляется
Есть ли что-то еще, что нужно сделать при установке свойства через отражение? Я предполагаю, что События не были инициированы должным образом, но я не могу понять, что делать.
Решил, что перед вызовом загрузчика была вставлена дополнительная модель, строка должна была сказать:
object Owner = Model.GetType().GetProperty("Owner").GetValue(Model, null);
Model.GetType().GetProperty(_loadingProperty).SetValue(Owner, true, null);