变量的绑定标签
本文关键字:标签 绑定 变量 | 更新日期: 2023-09-27 18:04:04
我刚开始使用WPF,我正试图在局部变量和标签之间设置绑定。基本上,我想在局部变量改变时更新标签。我正在寻找解决方案,但他们都只是使用文本框作为源,而不仅仅是类变量,我甚至不确定它是这样工作的。这是我的代码。
public partial class MainWindow : Window
{
int idCounter;
public MainWindow()
{
InitializeComponent();
Binding b = new Binding();
b.Source = idCounter;
b.Mode = BindingMode.OneWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
myLabel.SetBinding(Label.ContentProperty,b);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
idCounter++;
}
}
按钮确实工作,idCounter改变值,但它不更新标签,所以我猜绑定是错误的。谁能告诉我怎么了?由于
你的代码将工作,如果你改变你的类…
public partial class Window1 : Window, INotifyPropertyChanged
{
private int _idCounter;
public int IdCounter
{
get { return _idCounter; }
set
{
if (value != _idCounter)
{
_idCounter = value;
OnPropertyChanged("IdCounter");
}
}
}
public Window1()
{
InitializeComponent();
myLabel.SetBinding(ContentProperty, new Binding("IdCounter"));
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
e.Handled = true;
IdCounter++;
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
你遇到的一些问题是…
窗口本身应该实现INotifyPropertyChanged,以便绑定引擎可以在其上放置一个ear。
IdCounter需要是公共的,并且有一个公共getter,这样绑定引擎才能"获取"它。
你应该将DataContext设置为任何已经声明了IdCounter的类(在本例中是MainWindow)。部分问题是绑定引擎没有DataContext。
BindingMode是一个转移注意力的设置,因为标签默认是这样绑定的。
UpdateSourceTrigger是一个转移注意力的东西,因为标签的内容没有更新源属性的机制。标签的内容不像文本框,用户可以在其中键入代码需要知道的内容。当你绑定到用户无法更改的东西时,忘记UpdateSourceTrigger吧,重要的是Target属性。
处理程序应该标记事件。这是很好的做法,不会影响绑定。
绑定构造函数只需要路径。
这段代码会给你预期的结果;也就是说,当按钮被点击时,标签会更新。在vs2013, .net 4.5上检查,编译和执行。
其他受访者说你应该使用视图模型。我完全同意这一点,总的来说,这是一件值得考虑的事情。
您希望使用一个属性来完成此操作,并实现INotifyPropertyChanged
,以便在属性更改时更新label
的内容。
下面是一个使用简单的ViewModel
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:converters="clr-namespace:WpfApplication1"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Label Width="200" Height="50" Content="{Binding MyLabel}"/>
<Button Height="30" Width="100" Content="Increment" Click="Button_Click" />
</StackPanel>
</Window>
xaml.cs:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MainViewModel vm = new MainViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
vm.MyLabel += 1;
}
}
}
MainViewModel.cs:
namespace WpfApplication1
{
public class MainViewModel : INotifyPropertyChanged
{
#region Members
private int _myLabel;
#endregion Members
#region Properties
public int MyLabel
{
get
{
return _myLabel;
}
set
{
_myLabel = value;
NotifyPropertyChanged("MyLabel");
}
}
#endregion Properties
public MainViewModel()
{
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}
注意:理想情况下,您希望为Button
使用Command
而不是Click事件处理程序
- 你不能绑定私有或字段的东西,所以将其转换为公共属性。你可以在这里找到更多关于什么是有效绑定源的信息
-
如果你想改变你的属性被UI拾取,你应该实现
INotifyPropertyChanged
接口,并在每次属性值改变时引发事件。所以idCounter
应该看起来像这样:private int _idCounter; public int idCounter { get { return _idCounter; } set { if (_idCounter != value) { _idCounter = value; OnPropertyChanged("idCounter"); } } }
-
创建属性绑定时,使用
Path
-
Binding在绑定上下文中工作,因此您需要指定从何处获取此
Path
。最简单的方法是设置DataContext
。在你的例子中,初始化应该像这样:Binding b = new Binding("idCounter"); b.Mode = BindingMode.OneWay; b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; myLabel.SetBinding(Label.ContentProperty, b); DataContext = this;
-
@d。moncada在他的回答中建议你应该创建专用的视图模型