2017-10-18 16 views
-1

私はViewModelのプロパティにバインドしたいtexblockを持つポップアップウィンドウを持っています。TextBlockのWPFプロパティバインディング

  <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> 
:私はすでに正常ここ

は私の.xamlです...私は基本的に私の文字列のために同じことを行っているが、何らかの形で文字列のプロパティは更新されません私のポップアップウィンドウにブール値をバインドさ、としています

[EDIT]:これらのボタンをクリックしたときの特性の変化が起こる:

 <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}"/> 

Iが正常にバインドさたプロパティのIsOpenでopenPopupの=「{バインディングopenPopupの}」、ないものです仕事はText = "{Download 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も正常に変更されますが、私のビューでは更新されません。私の欠点は何ですか?

[EDIT]:ボタンの結合:

public ICommand DownloadVersionCommand { 
     get; set; 
    } 

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

プログラムを実行してポップアップを表示すると、Visual Studioの出力ウィンドウにバインドエラーが表示されますか? –

+3

'DownloadText'と' OpenPopup'が両方とも同じviewmodelにある場合、あなたのコードは私にとって完璧に機能します。 –

+0

はい、両方とも同じviewmodelにあります... Ericの質問について:出力ウィンドウからこれを取得します: 'App.exe'(CLR v4.0.30319:App.exe): 'C:\ WINDOWS \ Microsoft.Net \ assembly \ 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

Perfect!私はちょうどバックグラウンドスレッドで試して、それは動作します。どうもありがとうございました! – scalderon

+2

@scalderon、このサンプルに示されている「火災と忘れた」タスク実行アプローチは非常に慎重に使用する必要があることに注意してください。 – dymanoid

関連する問題