[英]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
屬性,也可以將TextBlock
的DataContext
或其任何父元素設置為窗口的實例。
嘗試將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.