2016-06-28 81 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的功能如何。那么你永远不会回头看。 –