[英]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值。為什么這不起作用?
propertyName參數的Empty值或null表示所有屬性均已更改。
但是您不綁定任何屬性,而是綁定到模型本身。 在您的特定情況下,您可以綁定到IsActive
,稍微更改一下轉換器,它應該可以工作。
原因: Label的BindingContext
是JobViewModel
,而不是JobModel
。因此將永遠不會調用轉換中的邏輯。
由於使用了數據綁定,因此可以在JobViewModel
設置標簽Text
。
Text={Binding Content}
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.