c# WPF绑定不工作

本文关键字:工作 绑定 WPF | 更新日期: 2023-09-27 17:52:15

我对c#很陌生,我正在尝试创建一个带有菜单和文本块的WPF窗口,但我的数据绑定工作都没有。我在互联网上看到了几个页面和论坛,我看到人们总是在谈论设置一个DataContext,但我不知道为什么我的主窗口不被认为是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);}}
    }
}

c# WPF绑定不工作

看起来不像是在设置DataContext

你必须告诉你的xaml在哪里寻找它的数据。您可能会在输出窗口中看到Binding Expression错误。

在构造函数中放入

this.DataContext = this;

这将告诉你的xaml去MainWindow.cs文件寻找你要绑定的属性。我们这样做是为了当你开始学习MVVM时,你可以使你的DataContext成为一个视图模型,并停止使用后面的代码。

下面是一个简单的例子:

在MainWindow.xaml中

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

在你的mainwindow . example .cs

public partial class MainWindow : Window{
      public String myTextProperty {get; set;}
      public MainWindow(){
          InitializeComponent();
          myTextPropety = "It works!";
          this.DataContext = this;
      }
}

注意,我是在设置DataContext之前设置属性的。我是有意这么做的。您的xaml只会去查找它的属性值一次。

如果你想让它在你改变属性时更新,那么你需要实现INotifiyPropertyChanged

你可以在MSDN文章和这篇堆栈溢出文章中阅读到INotifyPropertyChanged -是否存在更好的方法?