2017-10-18 180 views
-1

我有一个弹出窗口,其中我有一个texblock,我想绑定到我的ViewModel属性。我已经成功绑定一个布尔值,在我的弹出窗口,我已经基本上完成了我的字符串是相同的,但不知何故字符串属性不更新......WPF属性绑定的TextBlock

这里是我的.xaml:

  <Popup Margin ="10" HorizontalAlignment="Center" VerticalAlignment="Top" AllowsTransparency="True" IsOpen="{Binding OpenPopup}" Height="150" Width="300"> 
        <Grid Background="#FFFFCCCC"> 
         <TextBlock x:Name="NewVersionText" Margin="10,10,10,10" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="14" Width="230"> 
          Eine neue Version der Applikation ist verfügbar. <LineBreak /> Möchten Sie diese herunterladen? 
         </TextBlock> 
         <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="10,10,10,10" TextWrapping="Wrap" Width="230" Text="{Binding DownloadText}"/> 
        </Grid> 
      </Popup> 

[编辑]:这些按钮点击时的属性的改变发生:

 <Button Content="Ja" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="70" Command="{Binding DownloadVersionCommand}"/> 
     <Button Content="Später" HorizontalAlignment="Left" Height="20" Margin="75,0,0,0" VerticalAlignment="Top" Width="70" Command="{Binding ClosePopupCommand}"/> 

物业我已经成功绑定是OpenPopup在ISOPEN =“{结合OpenPopup}”,即不所述一个工作是Text =“{Binding DownloadText}”中的DownloadText。 .xaml有一个已经连线的ViewModel(正如我所说的,它可以很好地处理所有其他属性)。

在我的视图模型C#代码是:[编辑:两个性质是在相同的视图模型] 对于文本字符串:

private string _downloadText; 
    public string DownloadText { 
     get { 
      return _downloadText; 
     } 
     set { 
      _downloadText = value; 
      Debug.WriteLine("DownloadText = " + value); 
      RaisePropertyChanged(); 
     } 
    } 


    private void DownloadVersion() { 
     DownloadText = "Download gestartet"; 
     VersionManager.downloadFile(); 

对于弹出布尔:

private bool _openPopup; 
    public bool OpenPopup { 
     get { 
      return _openPopup; 
     } 
     set { 
      _openPopup = value; 
      Debug.WriteLine("Open Popup = " + value); 
      RaisePropertyChanged(); 
     } 
    } 

    private void ClosePopoup() { 
     OpenPopup = false; 
    } 

RaisePropertyChanged()方法是这样实现的:

public event PropertyChangedEventHandler PropertyChanged; 
private void RaisePropertyChanged([CallerMemberName] string propertyName = null) { 
    if (PropertyChanged == null) 
     return; 
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     Debug.WriteLine("MainWindowViewModel, PropertyChanged: " + propertyName); 
} 
    } 

当CloseP调用opup()方法时,属性发生变化,导致我弹出窗口的IsOpen-Property变为false,并关闭..就像它应该那样。

当调用DownloadVersion()方法时,属性DownloadText也成功更改,但未在我的视图中更新。任何建议我失踪?

[编辑]:绑定按钮:

public ICommand DownloadVersionCommand { 
     get; set; 
    } 

// In the ViewModel Constructor: 
     DownloadVersionCommand = new RelayCommand(o => { 
      Debug.Write("DownloadVersionCommand " + o); 
      DownloadVersion(); 
     }) 
+2

当您运行该程序并显示弹出窗口时,是否在Visual Studio的输出窗口中看到任何绑定错误? –

+3

如果'DownloadText'和'OpenPopup'都在同一个视图模型中,那么您的代码对我来说非常适用。 –

+0

是的,两者都在相同的viewmodel ...至于埃里克的问题:我从输出窗口得到这个:'App.exe'(CLR v4.0.30319:App.exe):加载'C:\ WINDOWS \ Microsoft.Net \装配\ GAC_MSIL \ System.Numerics.Vectors \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Numerics.Vectors.dll”。找不到或打开PDB文件。 DownloadVersionCommand DownloadText =下载gestartet MainWindowViewModel,PropertyChanged:DownloadText – scalderon

回答

1

你可以尝试调用VersionManager.downloadFile()在后台线程:

private void DownloadVersion() { 
    DownloadText = "Download gestartet"; 
    Task.Run(() => VersionManager.downloadFile()); 
} 

或暂时注释掉或删除下载通话用于测试目的:

private void DownloadVersion() { 
    DownloadText = "Download gestartet"; 
} 

然后它应该工作。

您不能同时更新TextBlock并在同一个线程上下载文件。

+0

完美!我只是用后台线程来尝试它,它的工作原理。非常感谢你! – scalderon

+2

@scalderon,请注意,此示例中显示的“即发即丢”任务运行方法应非常仔细地使用。 – dymanoid