微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当实现为MVVM时,数据绑定不起作用

如何解决当实现为MVVM时,数据绑定不起作用

所以我想用MVVM构建一个反向计时器。这是XAML:

<Window x:Name="GcMain" x:Class="Example.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="clr-namespace:Example.viewmodel"
        mc:Ignorable="d"
        Title="App" Height="560" Width="800" Background="#841212" Closing="Window_Closing" ResizeMode="noresize">
    
    <Window.Resources>
        <vm:MainWindowviewmodel x:Key="Vm"/>
    </Window.Resources>
...
 <StackPanel Grid.Column="0">
                            <TextBlock  DataContext="{StaticResource ResourceKey=Vm}" Text="{Binding TimeLefter,Mode=TwoWay}" FontSize="12" FontStyle="Oblique"/>
                            <TextBox  DataContext="{StaticResource ResourceKey=Vm}" Text="{Binding TimeLefter,Mode=TwoWay}" FontSize="12" FontStyle="Oblique"/>
...

这是viewmodel:

namespace Example.viewmodel
{
    class MainWindowviewmodel : INotifyPropertyChanged
    {

        private string _timeLeft;
        dispatcherTimer _timer;
        static TimeSpan _time;

        private string timeLeft;

        public string TimeLefter
        {
            get
            {
                return timeLeft;
            }
            set
            {
                timeLeft = value;
                OnPropertyChanged();
            }
        }


        public MainWindowviewmodel()
        {
            _time = TimeSpan.FromMinutes(45);
        }

        public void StartTimer()
        {
            _timer = new dispatcherTimer(new TimeSpan(0,1),dispatcherPriority.normal,delegate
            {
                MessageBox.Show(TimeLefter); // this shows correct!
                TimeLefter = _time.ToString(@"mm\:ss");
                if (_time == TimeSpan.Zero)
                {
                    _timer.Stop();
                }
                _time = _time.Add(TimeSpan.FromSeconds(-1));
            },Application.Current.dispatcher);
            _timer.Start();
        }

        public event PropertyChangedEventHandler PropertyChanged;
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
        }
    }
}

MainWindows.xaml.cs中的代码

...
InitializeComponent();
MainWindowviewmodel mainWindowviewmodel = new MainWindowviewmodel();
mainWindowviewmodel.StartTimer();
...

当消息框显示完全正确的输出时,绑定不起作用!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?