Как получить ReactiveUI WhenAnyValue для излучения при изменении свойства за пределами установщика класса - PullRequest
0 голосов
/ 19 июня 2019

Мне интересно, как я мог бы по-прежнему вызывать ReactiveUI WhenAnyValue со свойством, которое могло быть изменено вне установщика свойства в классе.Пожалуйста, извините, пример только что попытался сделать что-то быстрое, чтобы понять суть.Допустим, у меня есть два класса, один из которых человек, а другой - адрес.

public class Address : ReactiveObject
{
    [Reactive]
    public string Street1 { get; set; }
    [Reactive]
    public string Street2 { get; set; }
    [Reactive]
    public string State { get; set; }
    [Reactive]
    public string City { get; set; }
    [Reactive]
    public string ZipCode { get; set; }
}

public class Person : ReactiveObject
{

    [Reactive]
    public string Name { get; set; }

    [Reactive]
    public Address Address { get; set; }


    public Person(Address address)
    {
        Address = address;
        address.Changed .Subscribe(_ =>
        {
            //Tried this way
            this.RaisePropertyChanged(_.PropertyName);

            //Also tried this way
            this.RaisePropertyChanged(nameof(Address));
        });

        this.Changed.Subscribe(_ =>
        {
            Console.WriteLine($"Person Property: {_.PropertyName} changed");
        });

        this.WhenAnyValue(_ => _.Name, _ => _.Address, (a, b) => "Emit").Subscribe(Console.WriteLine);
    }
}

private static void Main(string[] args)
{
    var address = new Address
    {
        Street1 = "Street1",
        Street2 = "Street2",
        City = "City",
        State = "LA",
        ZipCode = "11111"
    };

    var person = new Person(address);

    person.Name = "Name";
    Task.Delay(3000).Wait();

    address.City = "CityChanged";


    Console.ReadLine();
}

Я бы подумал, что мне нужно будет только подписаться на наблюдаемый адрес, измененный, а затем изнутри Person RaisePropertyChanged для свойства адреса.Он излучает в Измененную Наблюдаемую Личность и ведет себя так, как я и ожидал, но в этом сценарии никогда не генерируется Наблюдаемая Когда-Личность в Персоне.

1 Ответ

0 голосов
/ 19 июня 2019

Я разобрался в проблеме. Проблема в том, что я должен добавить все вложенные свойства в WhenAnyValue. В моем примере, если я изменю эту строку

this.WhenAnyValue(_ => _.Name, _ => _.Address, (a, b) => "Emit").Subscribe(Console.WriteLine);

до

this.WhenAnyValue(_ => _.Name, _ => _.Address.City, (a, b) => "Emit").Subscribe(Console.WriteLine);

Издает. Ключ там меняет его с _.Address на _.Address.City. Кроме того, он все еще излучает без необходимости подписываться на Address.Changed Observable, что еще лучше.

...