变量的绑定标签

本文关键字:标签 绑定 变量 | 更新日期: 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

的示例xaml:

<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事件处理程序

  1. 你不能绑定私有或字段的东西,所以将其转换为公共属性。你可以在这里找到更多关于什么是有效绑定源的信息
  2. 如果你想改变你的属性被UI拾取,你应该实现INotifyPropertyChanged接口,并在每次属性值改变时引发事件。所以idCounter应该看起来像这样:

    private int _idCounter;
    public int idCounter
    {
        get { return _idCounter; }
        set
        {
            if (_idCounter != value)
            {
                _idCounter = value;
                OnPropertyChanged("idCounter");
            }
        }
    }
    
  3. 创建属性绑定时,使用Path

  4. Binding在绑定上下文中工作,因此您需要指定从何处获取此Path。最简单的方法是设置DataContext。在你的例子中,初始化应该像这样:

    Binding b = new Binding("idCounter");
    b.Mode = BindingMode.OneWay;
    b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    myLabel.SetBinding(Label.ContentProperty, b);
    DataContext = this;
    
  5. @d。moncada在他的回答中建议你应该创建专用的视图模型