2017-08-09 9 views
0

ステータスバーを更新するために自分のStatusObjectクラスをセットアップしました。デバッグ時にはすべてが更新されているようですが、StatusBarはテキストを表示しません。私は痛いほど明白な何かがあるという気持ちを得るが、私は何を言うことができない。データバインディングは大丈夫ですが、わかりません。誰でも何かを見つけられますか?Databound StatusBarItem TextBlockが更新されない

ビュー

<Window x:Class="WpfApp3.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:local="clr-namespace:WpfApp3" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid Margin="13,167,-29,156" x:Name="StatusGrid" DataContext="{Binding}"> 

      <StatusBar x:Name="StatusBar" HorizontalAlignment="Left" Height="45" VerticalAlignment="Top" Width="497" Margin="0,0,0,-45" > 
       <StatusBarItem Width="171"> 
       <TextBlock Text="{Binding Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="161" Height="37"/> 
       </StatusBarItem> 
    <Separator/> 
       <StatusBarItem> 
       <TextBlock Text="{Binding ActiveJoist, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="314" Height="38"/> 
       </StatusBarItem> 
      </StatusBar> 

    </Grid> 
<Button Content="Button" HorizontalAlignment="Left" Margin="13,219,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 

    </Grid> 
</Window> 

コード

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using System.Windows; 
namespace WpfApp3 
{ 
public partial class MainWindow : Window 
    { 

    public class StatusObject : INotifyPropertyChanged 
    { 
     public ObservableCollection<string> Log { get; set; } 
     public string Status { get; set; } 
     public string ActiveJoist { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 

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

    public MainWindow() 
    { 
     InitializeComponent(); 
     StatusGrid.DataContext = statusObject; 

    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Create(); 
    } 

    public void Create() 
    { 
     statusObject.Status = "test string"; 
     statusObject.ActiveJoist = "test string 2"; 
    } 
    } 
} 

編集の後ろ:それが重要かどうかわからないが、私はほぼ同じで、私のビューで複数のデータグリッドにバインドされた複数のdatacontextsを、持っています正確なファッション、問題なく。

+0

問題を確実に再現する良い[mcve]がなければ、コードに何が問題なのかを言うことはできません。 'DataContext =" {Binding} "'をバインドするのはちょっと奇妙だと思います。なぜなら、とにかく存在するアンビエントデータコンテキストに 'DataContext'プロパティを設定しているからです。だからあなたがそれが何か違うことを期待すれば、それはあなたがどんな問題を抱えているかを説明するかもしれない。本当の答えが必要な場合は、問題を修正してください。 –

+0

出力ウィンドウにエラーが表示されますか?エラーのように:40? – XAMlMAX

+0

メインのUIスレッドで何らかの処理を行っている場合、プロセスが終了するまでプログレスバーが更新されません。この場合、別のスレッドで処理しなければならず、ディスパッチャを使用してプログレスバーを更新してください。 – stuicidle

答えて

0

問題は私のクラスであり、明示的にOnPropertyChangedを呼び出していませんでした。プロパティをバッキングフィールドに変更し、明示的にOnPropertyChangedを呼び出しました。ここに更新されたクラスがあります。私はなぜこれがうまくいくのかわかりません。私は明示的にOnPropertyChangedを呼び出さない他のクラスを持っていますが、まだ完全にバインドして更新します。誰かが知っていると、私は説明を聞くのが大好きです。

public class StatusObject : INotifyPropertyChanged 
{ 
    public ObservableCollection<string> Log { get; set; } 

    private string _status; 
    public string Status 
    { 
     get => _status; 
     set 
     { 
      _status = value; 
      OnPropertyChanged(nameof(Status)); 
     } 
    } 

    private string _activeJoist; 
    public string ActiveJoist 
    { 
     get => _activeJoist; 
     set 
     { 
      _activeJoist = value; 
      OnPropertyChanged(nameof(ActiveJoist)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

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

あなたが[mcve]標準に合格しなかったときの大きな問題は、怠惰のために何が残されているのかわからないことです。ここでは、元のコード例では 'PropertyChanged'イベントが発生していないことを示していますが、他のものを推測させてしまったので、OnPropertyChanged()の呼び出しを推測するかどうかはわかりません。 –

+0

フィードバックを歓迎しますが、最初のコメントはちょっとばかげています。怠惰の結果として何が放棄されたのか、それとも私のコードが表現するものなのか、完全な知識がないので、最小、完全、および検証可能なサンプルの基準を満たしているかどうかは分かりません。 'OnPropertyChanged()'が元のコード内に出現しなかった場合、意図的にそれが意図的に除外されたと思う理由は不明です。 – lavantgarde

+0

あなたは完全にポイントを逃しています。 _blatantly_を組み込んだコード例は、 "完全な"標準を満たしていませんでした。 _それはなぜ私があなたがそれが意図的に除外されたと思うのか不明だ」_私たちがそうであったかどうかは分かりません。それはわかりませんが、コードの一部を残しておいても、あなたもその部分を残してしまったことは同じように考えられます。それはあなたが完全に無視している私の指摘です。あなたの投稿が良いものだった場合は、残っている部分が本当にあなたの本当のコードになっているという自信があります。しかし、そうではありませんでした。 –

関連する問題