如何将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;
}
答案 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));
}
}
}