如何将XAML中的WPF FontSize TextBox绑定到类成员变量?
我有一个通过应用程序使用的字体集合。我希望在代码后面动态地更改这些字体的值,然后在运行时反映这些更改。
我怎样才能做到这一点?
这里是我的类定义看起来像
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;
}
发布于 2017-03-12 13:14:18
我会这样创造它:
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}"/>
发布于 2017-03-12 13:16:04
很可能需要一个DataContext = this;在Mainwindow.xaml.cs的构造函数中。您还需要在Mainwindow.xaml.cs中返回SampleClass。
发布于 2017-03-12 14:39:26
您只能绑定到公共属性,所以首先要做的是使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));
}
}
}
https://stackoverflow.com/questions/42753168
复制相似问题