Я выполнил реализацию INotifyPropertyChanged
, аналогичную описанному ниже методу. Здесь свойства сохраняются в словаре в базовом классе, показанном ниже. Конечно, не всегда желательно использовать наследование, но для моделей представлений я считаю приемлемым и дает очень чистые ссылки на свойства в классах моделей представления.
public class PhotoDetailsViewModel
: PropertyChangedNotifierBase<PhotoDetailsViewModel>
{
public bool IsLoading
{
get { return GetValue(x => x.IsLoading); }
set { SetPropertyValue(x => x.IsLoading, value); }
}
public string PendingOperation
{
get { return GetValue(x => x.PendingOperation); }
set { SetPropertyValue(x => x.PendingOperation, value); }
}
public PhotoViewModel Photo
{
get { return GetValue(x => x.Photo); }
set { SetPropertyValue(x => x.Photo, value); }
}
}
Ниже показан несколько более сложный базовый класс. Он обрабатывает перевод из лямбда-выражения в имя свойства. Обратите внимание, что свойства действительно псевдо-свойства, поскольку используются только имена. Но он будет казаться прозрачным для модели представления и ссылки на свойства модели вида.
public class PropertyChangedNotifierBase<T> : INotifyPropertyChanged
{
readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
protected U GetValue<U>(Expression<Func<T, U>> property)
{
var propertyName = GetPropertyName(property);
return GetValue<U>(propertyName);
}
private U GetValue<U>(string propertyName)
{
object value;
if (!_properties.TryGetValue(propertyName, out value))
{
return default(U);
}
return (U)value;
}
protected void SetPropertyValue<U>(Expression<Func<T, U>> property, U value)
{
var propertyName = GetPropertyName(property);
var oldValue = GetValue<U>(propertyName);
if (Object.ReferenceEquals(oldValue, value))
{
return;
}
_properties[propertyName] = value;
RaisePropertyChangedEvent(propertyName);
}
protected void RaisePropertyChangedEvent<U>(Expression<Func<T, U>> property)
{
var name = GetPropertyName(property);
RaisePropertyChangedEvent(name);
}
protected void RaisePropertyChangedEvent(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private static string GetPropertyName<U>(Expression<Func<T, U>> property)
{
if (property == null)
{
throw new NullReferenceException("property");
}
var lambda = property as LambdaExpression;
var memberAssignment = (MemberExpression) lambda.Body;
return memberAssignment.Member.Name;
}
public event PropertyChangedEventHandler PropertyChanged;
}
Вы могли бы посмотреть здесь: https://askubuntu.com/questions/tagged/wubi
, Прежде чем Вы сделаете установку wubi, необходимо записать DVD и загрузиться от живого DVD. Существует опция 'Try Ubuntu'. Попробуйте это сначала прежде, чем сделать любую установку на всякий случай, это не совместимо с Вашими аппаратными средствами. Когда Вы говорите, что 'я поместил обоих файлы в ту же папку', я не ясен, что Вы имеете в виду. Нормальный путь состоит в том, чтобы записать DVD и выполнить autopla из Windows. Разъяснитесь.