如何将XAML中的WPF TextBox的FontSize绑定到类成员变量?

时间:2017-03-12 21:07:11

标签: c# wpf xaml

如何将XAML中的WPF TextBox的FontSize绑定到类成员变量?

我有一组通过应用程序使用的字体。 我想在后面的代码中动态更改这些字体的值,然后在运行时反映这些更改。

我如何实现这一目标?

以下是我的课程定义

public ClassFoo
{
   public double FontSize {get; set;}
}

这是我在MainWindow.xaml.cs中定义我的类的方法:

public ClassFoo SampleClass;

这是我的XAML的样子:

<TextBlock Name="txtSample" Text="SomeText" 
     FontSize="{Binding SampleClass.FontSize}"/>

然后在运行时,我实例化该类并对其进行初始化:

SampleClass = new ClassFoo()
{
   FontSize = 16;
}

3 个答案:

答案 0 :(得分:1)

我会像那样创建它:

 public class MainWindow : Page
    {
        public Foo Foo { get; set; }

        public MainWindow()
        {
            DataContext = this;
        }
    }


    public class Foo : INotifyPropertyChanged
    {
        private double _fontSize;

        public double FontSize
        {
            get { return _fontSize; }
            set
            {
                _fontSize = value;
                OnPropertyChanged(nameof(FontSize));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

然后将其称为:

<TextBlock Name="txtSample" Text="SomeText" 
     FontSize="{Binding Foo.FontSize}"/>

答案 1 :(得分:0)

最有可能你需要一个DataContext = this;在Mainwindow.xaml.cs的构造函数中。您还需要在Mainwindow.xaml.cs中返回SampleClass。

答案 2 :(得分:0)

您只能绑定到公共属性,因此首先要做的是使SampleClass属性:

public ClassFoo SampleClass { get; set; }

如果你打算在窗口的构造函数返回后在运行时动态设置它,那么窗口应该实现INotifyPropertyChanged接口并提高taget属性的更改通知以自动更新。

最后,必须以某种方式将绑定源设置为窗口。您可以显式设置绑定的Source属性,或将DataContext或其任何父元素的TextBlock设置为窗口的实例。

尝试使用您发布的XAML标记MainWindow类的此实现:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        this.Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        SampleClass = new ClassFoo()
        {
            FontSize = 16
        };
    }

    private ClassFoo _sampleClass;
    public ClassFoo SampleClass
    {
        get { return _sampleClass; }
        set { _sampleClass = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}