2017-08-09 60 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"; 
    } 
    } 
} 

編輯:不知道它的問題,但我有綁定到多個DataGrid中我查看多個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

欣賞反饋,但您的第一條評論有點荒謬。由於懶惰或因爲這就是我的代碼所代表的內容,是否符合Minimal,Complete和Verifiable示例標準,因爲您沒有完整的知識,所以您無法分辨出什麼是遺漏的。如果'OnPropertyChanged()'沒有出現在原代碼中,我不清楚爲什麼你會認爲它是故意遺漏的,最小的,完整的,可驗證的或不是。 – lavantgarde

+0

你完全錯過了這一點。您包含_blatantly_的代碼示例未能符合「完整」標準。 _「我不清楚爲什麼你會認爲這是被故意排除的 - 」 - 這不是我們會認爲它是或不是。這是我們不能說的,而且因爲你確實遺漏了代碼的一部分,所以你也離開了那部分代碼也同樣合理。這是我的觀點,你完全無視。如果你的文章是一個很好的文章,我們可以相信,那些被遺漏的部分確實在你的真實代碼中。但事實並非如此,我們不能。 –