我目前正面臨使用 WPF MVVM 資料系結的奇怪問題。
這個想法是使用 ValueConverter,如果它不為 null,則顯示系結值,否則顯示在ConverterParameter.
Person具有以下屬性的類:Name (string), Surname (string), Country (class).
Country類具有以下屬性:CountryName (string).
當 TextBlock 系結到 a時,如果a為空,則使用 aIValueConverter 失敗。該方法甚至沒有觸發檢查系結值是否為空。Person.Country.CountryNamePerson.CountryIValueConverterConvert
同時IMultiValueConverter作業得很好,每次都觸發,無論是否為Person.Country空。
想法為什么會這樣?嘗試搜索任何 Microsoft 文章,但一無所獲。
任何幫助表示贊賞。
源 GitHub 專案可以在這里找到:https ://github.com/kevintw86/WpfBindingConverterIssue.git
系結到 IValueConverter(當 Person.Country==null 時無法正常作業):
<TextBlock
Text="{Binding Person.Country.CountryName,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource PersonConverter},
ConverterParameter=- Not set -}"
FontSize="16"/>
人物轉換器:
public class PersonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return parameter;
if (value == DependencyProperty.UnsetValue)
return parameter;
if (string.IsNullOrWhiteSpace(value.ToString()))
return parameter;
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
系結到 IMultiValueConverter(即使 Person.Country==null 也能正常作業):
<TextBlock FontSize="16">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource PersonMultiConverter}"
ConverterParameter="- Not set -">
<MultiBinding.Bindings>
<Binding Path="Person.Country.CountryName"
UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
人多轉換器:
public class PersonMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null)
return parameter;
if (values[0] == DependencyProperty.UnsetValue)
return parameter;
if (values[0] == null)
return parameter;
if (string.IsNullOrWhiteSpace(values[0].ToString()))
return parameter;
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
人物類:
public class Person : INotifyPropertyChanged
{
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
OnPropertyChanged();
}
}
private string _Surname;
public string Surname
{
get { return _Surname; }
set
{
_Surname = value;
OnPropertyChanged();
}
}
private Country _Country;
public Country Country
{
get { return _Country; }
set
{
_Country = value;
OnPropertyChanged();
}
}
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
國家級:
public class Country : INotifyPropertyChanged
{
private string _CountryName;
public string CountryName
{
get { return _CountryName; }
set
{
_CountryName = value;
OnPropertyChanged();
}
}
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
主視窗視圖模型:
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
this.Person = new Person
{
Name = "John",
Surname = null,
Country = null,
};
}
#region Properties
private Person _Person;
public Person Person
{
get { return _Person; }
set
{
_Person = value;
OnPropertyChanged();
}
}
#endregion
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
uj5u.com熱心網友回復:
考慮使用TargetNullValue和FallbackValue而不是轉換器:
<TextBlock
Text="{Binding Person.Country.CountryName,
TargetNullValue='- Not set -',
FallbackValue='- Not set -'}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465783.html
