【问题标题】:Set the render size using data binding使用数据绑定设置渲染大小
【发布时间】:2013-12-21 00:32:27
【问题描述】:

我在 XAML 中为我的 AppBatButton 使用下一个代码:

 <AppBarButton Icon="Play" Label="Play" Click="btn_Click">
    <AppBarButton.RenderTransform>
        <CompositeTransform ScaleX="{Binding Path=ButtonsRenderSize}" ScaleY="{Binding Path=ButtonsRenderSize}"/>
     </AppBarButton.RenderTransform>
  </AppBarButton>

其中 ButtonsRenderSize 是在页面的 C# 部分声明的变量:

    public static double ButtonsRenderSize { get; set; }

    public MainPage()
    {

        InitializeComponent();

        ButtonsRenderSize = 0.75;
   }

问题是绑定不起作用。 RenderSize 仍然是 1。没有绑定它可以工作,但是当窗口不在全屏模式并且我有多个按钮时,我需要从代码中修改 RenderSize,所以绑定听起来是最好的主意。

【问题讨论】:

    标签: c# wpf xaml data-binding binding


    【解决方案1】:

    为了使您的绑定工作,需要以下步骤:

    1. 将 MainPage 的 DataContext 设置为它自己,这样您就可以将控件的属性绑定到后面代码中的属性。
    2. 每次为属性赋予新值时,实施 INotifyPropertyChanged 并引发 PropertyChanged 事件。动态更改属性值将使绑定到它的控件属性生效。

    例子:

    public partial class MainPage :  PhoneApplicationPage, INotifyPropertyChanged
    {
        public MainPage()
        {
            InitializeComponent();
            this.DataContext = this;
            ButtonsRenderSize = 0.75;
        }
    
        private double _buttonsRenderSize;
        public double ButtonsRenderSize 
        {
            get { return _buttonsRenderSize; }
            set 
            {  
                if(value != _buttonsRenderSize)
                {
                    _buttonsRenderSize = value;
                    //raise propertychanged event to notify UI's property to update it's value
                    OnPropertyChanged("ButtonsRenderSize");
                }
            }
        }
    
        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
    

    【讨论】:

    • 太好了,只要我使用 internal void OnPropertyChanged(string propertyName) ,evything 似乎就可以工作。 virtual 会产生错误并保护警告,但如果我使用 internal 显然没有问题。非常感谢您的回答! :) 一个问题:我可以在另一个类中移动 OnPropertyChanged 和 #region 和 #endregion 之间的所有行(只是为了更好的代码管理)?如果是,我将只需要在该类上实现 :INotifyPropertyChanged,对吗?
    • 是的,您可以创建一个实现 INotifyPropertyChanged 的​​基类,然后让类绑定继承基类,这样您就不必在每个地方重新实现 INotifyPropertyChanged。但通常的做法是那些要绑定的类不是背后的代码,它通常是视图模型。通过创建视图模型,您更接近于实现Model-View-ViewModel Pattern。这是围绕 WP 和 WPF 广泛使用的模式,我建议研究一下。
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多