我有一个MVC类,我继承了INotifyPropertyChanged
我有一个时钟计时器,用于分钟秒和小时更改xaml中的coontrol更新 OnPropertyChanged( “时代”);例如。这对于旋转3手的模拟时钟非常有用。但是,我想通过在矩形7段中绘制线条或切换可见性来制作数字时钟。
所以,为了做到这一点,我必须在后面的代码中做到这一点。因此,我需要能够访问我在ClockViewModel:INotifyPropertyChanged类中创建的那个时间 所以,从后面的代码我想用这个时间来切换到矩形的可见性或绘制段来显示时间。
我有一个mvc模拟时钟,可以通过onproperty更改旋转手,但我没有看到如何以相同的方式切换可见性或绘制/绘制。
那么,有没有办法从代码中的类中获取时间?或者在时间变化时获得房产变更?或者我是否必须在后面的代码中创建一个单独的非MVC计时器?
这是班级
class ClockViewModel : INotifyPropertyChanged
{
public ClockViewModel()
{
_timer = new System.Timers.Timer(1000);
_timer.Elapsed += _timer_Elapsed;
_timer.Start();
}
我想要做的是从类上运行一个switch语句获得恒定时间,这样我就可以在某些行上切换可见性来显示时间。或者,只需相应地绘制相应的线条。
我可以将文本块文本绑定到OnPropertyChanged(“DigitalTime”); 显示像数字一样的时间,但却打败了我想要做的事情。
答案 0 :(得分:0)
为此,我会在我的视图模型中添加属性,以定义每个线段的可见性。
然后每个属性getter将根据要显示的数字计算该行是否可见。
现在,您可以将每行的Visibility属性绑定到视图模型中的相应属性,并调用OnPropertyChanged(“”)(使用空字符串)以引发视图模型的所有侦听器。
一个简单的改进就是将用户控件分解为数字时钟中的一位数。然后,您可以为需要显示的每个数字重用该控件。
修改强>
我不会为你编写整个控件(有什么用?),但让我举一个例子。
我将假设您有一组线控制,可能在网格中或类似的东西。要绘制数字,您需要显示一些线条并隐藏其他线条
现在您需要一些xaml和一个提供数据的视图模型。
你的Xaml应该是这样的:
<Line X1="10" X2="10" Y1="10" Y2="20" Visibility="{Binding Line1Visibility, Mode=OneWay}" />
<Line X1="10" X2="20" Y2="10" Y2="10" Visibility="{Binding Line2Visibility, Mode=OneWay}" />
.... and so on
您需要定义所有行,但不需要为它们命名。不要使用我的X和Y值。它们仅用于示例。另请注意Visibilily的绑定。这是单向的,因为我们不想从我们的控制中设置它。
现在你需要你的视图模型。它应该定义所有可见性的属性以及设置要显示的数字的属性。它应该是这样的:
public class DigitalNumberViewModel : INotifyPropertyChanged
{
private int _numberToDisplay;
public int NumberToDisplay
{
get { return _numberToDisplay; }
set
{
_numberToDisplay = value;
OnPropertyChanged("");
}
}
public Visibility Line1Visibility
{
get
{
switch (NumberToDisplay)
{
case 0:
return Visibility.Visible;
case 1:
return Visibility.Hidden;
//... and so on
}
}
}
public Visibility Line2Visibility
{ .... }
// ... and so on
}
现在,您有一个视图模型,用于定义所有行的可见性以及您可以设置的属性,该属性将为视图模型中的所有属性调用属性已更改事件。你应该能够自己填写其余部分。 : - )
祝你好运!