C#WPF数据绑定无法正常工作

时间:2016-06-28 11:48:33

标签: c# wpf xaml

我是c#的新手,我正在尝试使用菜单和文本块创建一个WPF窗口,但我的数据绑定工作都没有。 我在互联网上看到了几个页面和论坛,我看到人们总是在谈论设置DataContext,但我不知道为什么我的MainWindow不被视为DataContext。我做错了吗?这是我的xaml:

<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);}}

    }
}

1 个答案:

答案 0 :(得分:4)

看起来您没有设置DataContext

您必须告诉您的xaml在哪里查找其数据。您可能会在输出窗口中看到绑定表达式错误。

在你的构造函数中添加

this.DataContext = this;

这将告诉您的xaml转到MainWindow.cs文件以查找您要绑定的属性。我们这样做,这样当你开始学习MVVM时,你可以使你的DataContext成为一个viewmodel并停止使用后面的代码。

这是一个简单的例子:

在您的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以及此Stack Overflow文章Implementing INotifyPropertyChanged - does a better way exist?

的内容