Change notify

Редактировал(а) Alexandr Fokin 2024/08/25 18:10

 
 Привязка
 
/// <summary>
/// Контейнер с INotifyPropertyChanged
/// </summary>
public class ObservableContainer<T>
    : INotifyPropertyChanged,
    IEquatable<ObservableContainer<T>>,
    IEquatable<T>
{
   #region prop

   private T _data;

   public event PropertyChangedEventHandler PropertyChanged;

   public T Data
    {
       get => _data;
       set
        {
            _data = value;
            PropertyChanged?.Invoke(
               this,
               new PropertyChangedEventArgs(nameof(Data))
                );
        }
    }

   #endregion


   #region ctor

   public ObservableContainer() { }
   public ObservableContainer(T data)
    {
        _data = data;
    }

   #endregion


   #region override

   public override string ToString()
    {
       return _data?.ToString() ?? "null";
    }

   public override int GetHashCode()
    {
       return _data?.GetHashCode() ?? 0;
    }

   public override bool Equals(object obj)
    {
       if (obj is ObservableContainer<T> o1)
        {
           return Equals(other: o1);
        }
       else if (obj is T o2)
        {
           return Equals(other: o2);
        }

       return false;
    }

   public bool Equals(ObservableContainer<T> other)
    {
       if (other.Data == null && Data == null)
        {
           return true;
        }
       if (other.Data != null)
        {
            other.Data.Equals(Data);
        }
       if (Data != null)
        {
            Data.Equals(other.Data);
        }

       return false;
    }

   public bool Equals(T other)
    {
       if (other == null && Data == null)
        {
           return true;
        }
       if (other != null)
        {
            other.Equals(Data);
        }
       if (Data != null)
        {
            Data.Equals(other);
        }

       return false;
    }

   #endregion

   #region operator

   public static implicit operator ObservableContainer<T>(T x)
    {
       return new ObservableContainer<T>(x);
    }
   public static implicit operator T(ObservableContainer<T> x)
    {
       return x.Data;
    }

   #endregion
}
public class TestModel2
{
   public ObservableContainer<string> Property1 { get; set; }
        = new ObservableContainer<string>();
   public ObservableContainer<string> Property2 { get; set; }
        = new ObservableContainer<string>();
}
<UniformGrid Rows="2" Columns="2">
   <TextBox Text="Prop1.Data"></TextBox>
   <TextBox Text="{Binding Path=Property1.Data, Mode=OneWay}"></TextBox>
   <Button Content="Right Bottom" ></Button>

   <TextBox Text="Prop2.Data"></TextBox>
   <TextBox Text="{Binding Path=Property2.Data, Mode=TwoWay}"></TextBox>
   <Button Content="Right Bottom" Click="Button_Click" ></Button>
</UniformGrid>
  

 

Теги: