C# 更新模型后WPF视图未更新位置

C# 更新模型后WPF视图未更新位置,c#,wpf,mvvm,inotifypropertychanged,C#,Wpf,Mvvm,Inotifypropertychanged,我有下一个结构: 主窗口 <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid Margin="100 70 0 0"> <local:RotateControl x:Name="rtc1" Panel.ZIndex="1" Width="{Binding ElementName=window

我有下一个结构: 主窗口

<Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Grid Margin="100 70 0 0">
        <local:RotateControl x:Name="rtc1" Panel.ZIndex="1" 
                             Width="{Binding ElementName=window,  Path=ActualHeight, Converter={StaticResource SizeConverter}}" 
                             Height="{Binding ElementName=window,  Path=ActualHeight, Converter={StaticResource SizeConverter}}" 
                             Radius="{Binding ElementName=window,  Path=ActualHeight, Converter={StaticResource RadiusConverter}}" 
                             Loaded="rtc1_Loaded" SizeChanged="rtc1_SizeChanged"/>
    </Grid>
    <StackPanel HorizontalAlignment="Right" Canvas.Right="80" Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBox x:Name="year" Width="40"></TextBox>
            <TextBox x:Name="month" Width="20"></TextBox>
            <TextBox x:Name="day" Width="20"></TextBox>
            <TextBox x:Name="hour" Width="20"></TextBox>
            <TextBox x:Name="min" Width="20"></TextBox>
            <TextBox x:Name="sec" Width="20"></TextBox>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBox x:Name="lat" Width="80" Text="55.75"></TextBox>
            <TextBox x:Name="lng" Width="80" Text="37.583333"></TextBox>
        </StackPanel>
        <ComboBox x:Name="cbHSys" Width="300" SelectedIndex="0"></ComboBox>
        <Button x:Name="GatData" Click="GatData_Click">Get data</Button>
        <ScrollViewer>
            <Label x:Name="julday"></Label>
        </ScrollViewer>
    </StackPanel>
</Canvas>
和更改数据的代码:

private void GetData()
        {
            julday.Content = "";
            //SetCurDate();
            DateTime date = new DateTime(Convert.ToInt32(year.Text), Convert.ToInt32(month.Text), Convert.ToInt32(day.Text),
                                         Convert.ToInt32(hour.Text), Convert.ToInt32(min.Text), Convert.ToInt32(sec.Text));
            CalcNatalChart(date);
            _model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
            this.ViewModel = _model;
        }

    private void GatData_Click(object sender, RoutedEventArgs e)
            {
                GetData();
            }    

    private void rtc1_Loaded(object sender, RoutedEventArgs e)
        {
            GetData();
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(1.0);
            _timer.Tick += timer_Tick;
            _timer.Start();
        }


        void timer_Tick(object sender, EventArgs e)
        {
            julday.Content = "";
            CalcNatalChart(DateTime.Now);
            _model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
            this.ViewModel = _model;
        }
格式为的所有数据均已正确更新,但无法查看。仅当按下按钮GatData\u单击时。动态更改数据不起作用。
你能帮我解决这个问题吗?谢谢

问题出在以下几行:

_model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
this.ViewModel = _model;
重新指定ViewModel后,视图不知道此更改,而是使用旧的对象实例。要么在构造函数中只初始化一次ViewModel,然后更改其属性,要么使该ViewModel属性也可观察,以便在数据更改时发出通知。

试试这个


而不是您的
this.ViewModel=\u model
put
this.ViewModel.Radious=\u model.Radious

而不是
\u model.Radius
尝试在所有位置使用
ViewModel.Radius
我这样做了,但对我没有帮助。我只在构造函数中设置了init ViewModel:您是如何更改Radius属性的?您需要以以下方式使用它:this.ViewModel.Radius=12;谢谢所有工作,但正如我在下面写的,只有在更改表单中的数据时。
private void GetData()
        {
            julday.Content = "";
            //SetCurDate();
            DateTime date = new DateTime(Convert.ToInt32(year.Text), Convert.ToInt32(month.Text), Convert.ToInt32(day.Text),
                                         Convert.ToInt32(hour.Text), Convert.ToInt32(min.Text), Convert.ToInt32(sec.Text));
            CalcNatalChart(date);
            _model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
            this.ViewModel = _model;
        }

    private void GatData_Click(object sender, RoutedEventArgs e)
            {
                GetData();
            }    

    private void rtc1_Loaded(object sender, RoutedEventArgs e)
        {
            GetData();
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(1.0);
            _timer.Tick += timer_Tick;
            _timer.Start();
        }


        void timer_Tick(object sender, EventArgs e)
        {
            julday.Content = "";
            CalcNatalChart(DateTime.Now);
            _model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
            this.ViewModel = _model;
        }
_model.Radius = (this.ActualHeight - (this.ActualHeight > 150 ? 150 : 0)) / 2;
this.ViewModel = _model;