UserControl 依赖项属性 绑定到 ViewModel 时值始终为 0 属性
UserControl DependencyProperty Value always 0 when bound to ViewModel Property
我有一个带有 3 个依赖属性的简单 UserControl。日、月、年。
public static readonly DependencyProperty DayProperty = DependencyProperty.Register("Day", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Day
{
get { return (int)GetValue(DayProperty); }
set { SetValue(DayProperty, value); }
}
public static readonly DependencyProperty MonthProperty = DependencyProperty.Register("Month", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Month
{
get { return (int)GetValue(MonthProperty); }
set { SetValue(MonthProperty, value); }
}
public static readonly DependencyProperty YearProperty = DependencyProperty.Register("Year", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Year
{
get { return (int)GetValue(YearProperty); }
set { SetValue(YearProperty, value); }
}
和另一个字符串 属性 DayOfWeek.
public string DayOfWeek
{
get { return new DateTime(Year, Month, Day).DayOfWeek.ToString(); }
}
Day 和 DayOfWeek 属性绑定到 XAML 中的两个文本框。
使用此 UserControl 并手动设置所有值时一切正常。
<c:DatePanel Day="1" Month="4" Year="2022"/>
当将这些绑定到我的 ViewModel 的属性时,它会抛出异常并显示月份和年份为 0。
<c:DatePanel Day="2" Month="{Binding Month}" Year="{Binding Year}"/>
System.ArgumentOutOfRangeException: "Year, Month, and Day parameters describe an un-representable DateTime."
我对这个话题很陌生,但我假设在控件初始化或其他事情时绑定尚未解决?
你会如何正确地做到这一点?
显然你的绑定不起作用。
原因是你已经显式地将UserControl
的DataContext
设置为自身,这有效地阻止了它从其父元素继承DataContext
并绑定到的属性它。
不要这样做:
this.DataContext = this;
每当 Day
、Month
或 Year
属性 已设置,但我在您的代码中看不到 PropertyChangedCallback
。
我有一个带有 3 个依赖属性的简单 UserControl。日、月、年。
public static readonly DependencyProperty DayProperty = DependencyProperty.Register("Day", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Day
{
get { return (int)GetValue(DayProperty); }
set { SetValue(DayProperty, value); }
}
public static readonly DependencyProperty MonthProperty = DependencyProperty.Register("Month", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Month
{
get { return (int)GetValue(MonthProperty); }
set { SetValue(MonthProperty, value); }
}
public static readonly DependencyProperty YearProperty = DependencyProperty.Register("Year", typeof(int), typeof(BoardPanel), new FrameworkPropertyMetadata(0));
public int Year
{
get { return (int)GetValue(YearProperty); }
set { SetValue(YearProperty, value); }
}
和另一个字符串 属性 DayOfWeek.
public string DayOfWeek
{
get { return new DateTime(Year, Month, Day).DayOfWeek.ToString(); }
}
Day 和 DayOfWeek 属性绑定到 XAML 中的两个文本框。
使用此 UserControl 并手动设置所有值时一切正常。
<c:DatePanel Day="1" Month="4" Year="2022"/>
当将这些绑定到我的 ViewModel 的属性时,它会抛出异常并显示月份和年份为 0。
<c:DatePanel Day="2" Month="{Binding Month}" Year="{Binding Year}"/>
System.ArgumentOutOfRangeException: "Year, Month, and Day parameters describe an un-representable DateTime."
我对这个话题很陌生,但我假设在控件初始化或其他事情时绑定尚未解决?
你会如何正确地做到这一点?
显然你的绑定不起作用。
原因是你已经显式地将UserControl
的DataContext
设置为自身,这有效地阻止了它从其父元素继承DataContext
并绑定到的属性它。
不要这样做:
this.DataContext = this;
每当 Day
、Month
或 Year
属性 已设置,但我在您的代码中看不到 PropertyChangedCallback
。