2

我正在学习关于属性绑定的 wpf c#。我创建了一个简单的 wpf 应用程序。我尝试将矩形控件的宽度绑定到后面代码中的属性“PageWidth”。但不知何故它不起作用(视图没有得到属性的变化)。我想要实现的目标: - 矩形的宽度在后面的代码中初始化为 100 - 如果单击“width++”按钮,矩形的宽度将逐步增加 10。我的代码中是否遗漏了什么?请建议并随时修改我的代码。提前致谢。

XAML:

<Window x:Class="MyWpfApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Rectangle
        Fill="#FF6262BD"
        HorizontalAlignment="Left"
        Margin="23,24,0,0"
        Stroke="Black"
        VerticalAlignment="Top"
        Width="{Binding Path=PageWidth}"
        Height="100" />
    <Button
        Content="Width++"
        HorizontalAlignment="Left"
        Margin="35,129,0,0"
        VerticalAlignment="Top"
        Width="75"
        Click="Button_Click" />

</Grid>

xml.cs:

using System;
using System.Windows;

namespace MyWpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            PageWidth = 100;
        }

        private Int32 _pageWidth;
        public Int32 PageWidth
        {
            get
            {
                return _pageWidth;
            }
            set
            { 
                if ( _pageWidth != value )
                {
                     _pageWidth = value;
                }
            }
         }

         private void Button_Click(object sender, RoutedEventArgs e)
         {
             if ( PageWidth <= 200 )
             {
                  PageWidth += 10;
             }
         }
     }
 }
4

1 回答 1

7

您的代码中有两个问题:

  • 你没有设置 a DataContext,所以绑定没有引用(它不知道它应该从哪个对象获取PageWidth属性)
  • PageWidth不是依赖属性并且不会引发PropertyChanged事件,因此无法在值更改时通知绑定系统。

要解决这些问题,您应该:

  • 将 DataContext 设置为窗口本身:

    // in the constructor
    DataContext = this;
    
  • 使MainWindow类实现INotifyPropertyChanged接口,并更改PageWidth属性以引发PropertyChanged事件:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        ...
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    
        private Int32 _pageWidth;
        public Int32 PageWidth
        {
            get
            {
                return _pageWidth;
            }
            set
            { 
                if ( _pageWidth != value )
                {
                     _pageWidth = value;
                     OnPropertyChanged("PageWidth");
                }
            }
         }
    
         ...
    
于 2013-10-06T00:14:40.973 回答