簡體   English   中英

值更改后,與ValueConverter的綁定未在UI中更新

[英]Binding with ValueConverter not updating in UI after value change

我有這個XAML

<Label
x:Name="lblStatus"
FontSize="Small"
LineBreakMode="NoWrap"
Text="{Binding ., Mode=OneWay, StringFormat='Status: {0}', Converter={views:JobStatusConverter}}" />;

我有JobViewModel綁定到它。

我已經使用了通知屬性更改OnPropertyChanged(new PropertyChangedEventArgs(String.Empty)); 在財產設定者中,但仍然沒有成功。 這是我的轉換器

public class JobStatusConverter : IMarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is JobModel model)
        {
            if (!model.IsActive)
             {
                    return "Notactive";
            }
            if (model.IsDone)
            {
                return "Closed";
             }
        return "Open";
    }
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => null;

public object ProvideValue(IServiceProvider serviceProvider) => this;


public bool Invert { get; set; }

}

這是我的模型代碼

    public class JobViewModel : ObservableObject
    {
    private JobModel Model { get; set; }

    public bool IsActive =>
        Model?.IsActive ?? false;

    public bool IsDone =>
        Model?.IsDone ?? false;

    public void ReceiveData()
    {
        try
        {
            Model = GetJobData("JB001");
        }
        catch (Exception ex)
        {

        }
        finally
        {
            OnPropertyChanged(new PropertyChangedEventArgs(String.Empty));
        }
    }
}

從命令調用ReceiveData()后,所有其他UI值都會更新,但不會更新lblStatus值。為什么這不起作用?

根據https://docs.microsoft.com/zh-CN/dotnet/api/system.componentmodel.propertychangedeventargs.-ctor?view=netframework-4.8

propertyName參數的Empty值或null表示所有屬性均已更改。

但是您不綁定任何屬性,而是綁定到模型本身。 在您的特定情況下,您可以綁定到IsActive ,稍微更改一下轉換器,它應該可以工作。

原因: Label的BindingContextJobViewModel ,而不是JobModel 。因此將永遠不會調用轉換中的邏輯。

由於使用了數據綁定,因此可以在JobViewModel設置標簽Text

Text={Binding Content}

在ViewModel中

public class JobViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string content;
    public string Content
    {
        get
        {
            return content;
        }

        set
        {
            if (content != value)
            {
                content = value;
                NotifyPropertyChanged();
            }
        }
    }

    private JobModel Model { get; set; }

    public bool IsActive =>
        Model?.IsActive ?? false;

    public bool IsDone =>
        Model?.IsDone ?? false;

    public JobViewModel()
    {
        if (!Model.IsActive)
        {
            Content = "Status:Notactive";
        }
        if (Model.IsDone)
        {
            Content = "Status:Closed";
        }
        Content = "Status:Open";
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM