Привязка WPF не работает, если свойство View Model установлено через Reflection - PullRequest
4 голосов
/ 30 декабря 2011

Я пытаюсь создать страницу, на которой будет отображаться индикатор выполнения, пока данные не будут успешно загружены с сервера.

Для этого я использую общий загрузчик данных, который просто заполнит свойства модели и установит для свойства 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);

1 Ответ

3 голосов
/ 30 декабря 2011

следующие строки

((Model as GenericModel).Owner as GenericPageModel).IsLoading = true;  // Works!!
Model.GetType().GetProperty(_loadingProperty).SetValue(Model, true, null); // Doesn't work

не эквивалентны. Первый влияет на свойство IsLoading объекта Model.Owner, второй - на сам объект Model.

Примечание : ваш базовый класс ViewModel действительно не должен называться GenericModel, поскольку это ViewModel, а не Model.

...