【发布时间】:2021-11-08 16:03:45
【问题描述】:
我有一个将评分显示为星数的 UserControl。它通过将 TextBlock 的 Text 属性绑定到常规代码隐藏属性来实现此目的,该属性又使用整数 DependencyProperty Value。
为了在 Value 发生变化时更新 TextBlock,我需要从 DependencyProperty 的 PropertyChangedCallback 手动触发 INotifyPropertyChanged.PropertyChanged 事件。
这感觉太过分了。有没有更简单的方法来做到这一点?
<TextBlock Text="{Binding RatingDisplay, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Rating}}}" />
public partial class Rating : UserControl, INotifyPropertyChanged
{
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(int), typeof(Rating), new PropertyMetadata(0, (sender, e) =>
{
((Rating)sender).RaisePropertyChanged(nameof(RatingDisplay));
}));
public Rating()
{
InitializeComponent();
}
public event PropertyChangedEventHandler? PropertyChanged;
public int Value
{
get => (int)GetValue(ValueProperty);
set => SetValue(ValueProperty, value);
}
public string RatingDisplay => new string('*', Value);
protected void RaisePropertyChanged(string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
【问题讨论】:
-
为什么不使用与 UserControl 连接的 ViewModel?这样你就不需要一个 Dependency 属性来让你的代码更容易阅读。
-
这是一个糟糕的建议。 UserControl - 与任何其他控件一样 - 不应该有自己的私有视图模型,这将与应用程序的视图模型结构断开连接。
标签: c# wpf data-binding dependency-properties