C# 如果值在另一个类中更改,如何更改一个类中的值

C# 如果值在另一个类中更改,如何更改一个类中的值,c#,xamarin.forms,C#,Xamarin.forms,假设我的ViewModel中有一个参数: public string ChosenQualityParameter { get => DefectModel.SelectedQualDefectParameters?.Name ?? "Не выбран параметр"; } 我有一个带有参数SelectedQualDefectParameters.Name的类缺陷模型。我想更改绑定到ChosenQualityParameter的UI,当名称参数也更改时。 但我不知道该怎么

假设我的ViewModel中有一个参数:

public string ChosenQualityParameter
{
     get => DefectModel.SelectedQualDefectParameters?.Name ?? "Не выбран параметр";
}
我有一个带有参数SelectedQualDefectParameters.Name的类缺陷模型。我想更改绑定到ChosenQualityParameter的UI,当名称参数也更改时。
但我不知道该怎么做。有什么建议吗?提前感谢。

您可以这样定义ViewModel类:

public class ViewModel
{
    private DefectModel _defectModel;

    public ViewModel(DefectModel defectModel)
    {
        _defectModel = defectModel;
    }

    public string ChosenQualityParameter
    {
        get => _defectModel.SelectedQualDefectParameters?.Name ?? "Не выбран параметр";
    }
}
我个人不喜欢viewmodels中的这种依赖关系,但它可能在这里完成工作。无论如何,它似乎在控制台应用程序中工作:

using System;

public class Parameters
{
    public string Name { get; set; }
}

public class DefectModel
{
    public Parameters SelectedQualDefectParameters { get; set; }
}

public class ViewModel
{
    private DefectModel _defectModel;

    public ViewModel(DefectModel defectModel)
    {
        _defectModel = defectModel;
    }

    public string ChosenQualityParameter
    {
        get => _defectModel.SelectedQualDefectParameters?.Name ?? "Не выбран параметр";
    }
}

class Program
{
    static void Main()
    {
        var defectModel = new DefectModel
        {
            SelectedQualDefectParameters = new Parameters
            {
                Name = "test"
            }
        };

        var viewModel = new ViewModel(defectModel);

        Console.WriteLine(viewModel.ChosenQualityParameter);

        defectModel.SelectedQualDefectParameters.Name = "changed";

        Console.WriteLine(viewModel.ChosenQualityParameter);

        Console.ReadKey();
    }
}

多亏了@Knoop和@BartHofland,我通过在缺陷模型和所选QualdefectParameters类中使用InotifyProperty更改解决了我的问题。
对于设置ChosenQualityParameter,我使用MessagingCenter发送新值。

我认为这不会有帮助,更改名称时不会引发ChosenQualityParameter参数的属性更改事件。没错。我误解了他的问题。用户界面需要更新。。。但是您使用INotifyPropertyChanged实现的构造也会这样做吗?就我所见,它只更新ViewModel,不会触发UI刷新。但我可能弄错了。。。最后,您的解决方案可能与我的解决方案具有相同的功能效果。但是viewmodel不依赖于defectmodel。相反,您需要实现INotifyPropertyChanged两次。在一个这样的实现中,defectmodel需要知道它需要更新的viewmodel。只是另一个依赖项?@Knoop,但可能会触发INotifyPropertyChanged实现中的UI刷新。在这种情况下,您的解决方案可能会更好。如果UI使用绑定捕获ChosenQualityParameter,它应该对PropertyChanged事件做出反应。是的,您是对的。我刚刚重新阅读了您的评论,并注意到您还将在viewmodel上实现INotifyPropertyChanged。这确实应该行得通。我同意你的解决方案是正确的,肯定比我的好。请检查INotifyPropertyChanged。这将为您提供引发属性更改事件所需的工具,您必须为DefectModel上的SelectedQualDefectParameters属性实现此功能,SelectedQualDefectParameters上的Name属性和ViewModel上的ChosenQualityParameters如果SelectedQualDefectParameters发生更改,则ViewModel需要订阅更改:将PropertyChanged事件从上一个事件中取消挂钩,并重新挂钩到新事件。如果名称更改:在ViewModelHi@Knoop上为ChosenQualityParameter引发PropertyChanged事件,感谢您的回答!我确实像你说的那样为我的类添加了INotifyPropertyChanged接口。我不知道如何提高ChosenQualityParameter的性能,如何做到这一点。有什么例子吗?提前谢谢@Knoop如果我使用信息中心可以吗?你觉得呢?这取决于你到底是如何使用它的。目前无法检查,但在ViewModel中,您应该能够调用PropertyChangednameofChosenQualityParameter或类似的内容,以便在属性更改时引发属性更改事件。MessagingCenter是否适用于此取决于应用程序其余部分的设置,但可能有助于将管理DefectModel及其内容的任何组件的更改传达给ViewModel@Knoop:如果您在答案中提供了您的解决方案,则该答案可以用бббббббб作为正确答案;