2016-06-28 84 views
1

我對c#很新,我試圖創建一個帶有菜單和文本塊的WPF窗口,但沒有任何數據綁定工作。 我在互聯網上看到了幾個頁面和論壇,我看到人們總是在討論設置DataContext,但我不知道爲什麼我的MainWindow不被視爲DataContext。我做錯了什麼嗎?這是我的XAML:C#WPF數據綁定無法正常工作

<Window x:Class="holdingseditor.MainWindow" 
<Grid> 
    <TextBlock Height="30" Margin="0,24,0,0" Width="675" Text="{Binding DbRibbonText}" Background="{Binding DbRibbonColor}"/> 
    <TextBlock Height="30" Margin="675,24,0,0" Width="472" Background="{Binding WfRibbonColor}" Text="{Binding WfRibbonText}"/> 
    <Menu HorizontalAlignment="Left" Height="24" Margin="0,0,0,0" VerticalAlignment="Top" Width="1155"> 
     <MenuItem Header="_View"> 
      <MenuItem Header="Show _Archived Files History" Height="22" FontSize="12" Margin="0" Click="M_ShowArchivedFiles" IsEnabled="{Binding Path=DiesenameLoaded}"/> 
     </MenuItem> 

     <MenuItem Header="_Workflow"> 
      <MenuItem Header="O_utside Mode" Height="22" FontSize="12" Margin="0" IsCheckable="true" IsChecked="{Binding IsWfOutside}"/> 
     </MenuItem> 
    </Menu> 
</Grid>  
</Window> 

我的屬性看起來像:

namespace holdingseditor 
{ 
    public partial class MainWindow : Window 
    { 
     public bool DiesenameLoaded 
     {get { return false; }} 

     public bool IsWfOutside 
     {get { return true; }} 

     public string DbRibbonText 
     {get {return "my text";}} 

     public Color DbRibbonColor 
     {get {return Color.FromArgb(255, 0, 0, 255);}} 

    } 
} 

回答

4

看起來不像你設置你的DataContext

你必須告訴你的XAML哪裏找爲其數據。您可能會在輸出窗口中看到綁定表達式錯誤。

在你的構造函數把

this.DataContext = this;

這會告訴你的XAML去MainWindow.cs文件來尋找你綁定的屬性。我們這樣做是爲了當你開始學習MVVM時,你可以使你的DataContext成爲視圖模型並停止使用後面的代碼。

下面是一個簡單的例子:

在你MainWindow.xaml

<TextBlock Text="{Binding myTextProperty}"/> 

在你MainWindow.xaml.cs

public partial class MainWindow : Window{ 
     public String myTextProperty {get; set;} 

     public MainWindow(){ 
      InitializeComponent(); 
      myTextPropety = "It works!"; 
      this.DataContext = this; 
     } 
} 

請注意,我設置屬性之前我設置我的DataContext。我故意這樣做。你的xaml只會去尋找它的屬性值一次。

如果你想讓它當您更改屬性,那麼你需要實現INotifiyPropertyChanged

,你可以閱讀有關on the MSDN Article並在此堆棧溢出文章Implementing INotifyPropertyChanged - does a better way exist?

+0

謝謝安東尼的回答更新。在構造函數中設置DataContext最終會改變許多事情。 它適用於我的菜單項綁定,但它始終不能用於我的兩個TextBlock(文本和背景上的綁定)中的綁定。 也爲財產更新,我認爲它很好地工作,而不必做別的。看起來很多併發症並不是什麼大問題。老實說,對於一個用C++開發的人來說,在我看來,更容易手動更改所有內容,而不是使用這些數據綁定。 –

+1

好吧,我發現TextBlocks,問題是我的顏色的類型。 xaml預計SolidColorBrush。 –

+0

@pashashadkami是的,你必須確保你傳遞正確的類型到你想綁定的東西。您也可以使用轉換器。也就是說,每一位開始學習數據綁定的工程師都表示,手工更容易做到。直到你真正學會了如何做到這一點,以及MVVM的功能如何。那麼你永遠不會回頭看。 –