簡體   English   中英

如何將XAML中WPF文本框的FontSize綁定到類成員變量?

[英]How do I bind FontSize for WPF TextBox in XAML to a class member variable?

如何將XAML中WPF文本框的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;
}

我會這樣創建它:

 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}"/>

您最有可能需要一個DataContext = this; 在Mainwindow.xaml.cs的構造函數中。 您還需要在Mainwindow.xaml.cs中返回SampleClass。

您只能綁定到公共屬性,所以首先要做的就是將SampleClass為屬性:

public ClassFoo SampleClass { get; set; }

而且,如果您打算在返回窗口的構造函數之后在運行時動態設置它,則該窗口應實現INotifyPropertyChanged接口,並為Taget屬性引發更改通知以自動更新。

最后,綁定源必須以某種方式設置到窗口。 您可以顯式設置綁定的Source屬性,也可以將TextBlockDataContext或其任何父元素設置為窗口的實例。

嘗試將MainWindow類的此實現與您發布的XAML標記一起使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM