I can't Data Bind to a local variable in WPF/XAML

后端 未结 5 1651
无人及你
无人及你 2021-01-01 01:14

I want a textbox to display the value of a variable when I click it (an iteration of 1 to 100), I do not know what I am doing Wrong:

When I run the project nothing i

相关标签:
5条回答
  • 2021-01-01 01:44

    You need to make the property tell the binding that it has updated. The standard way to do this is via:

    1. Implementing INotifyPropertyChanged
    2. Making the myText property a DependencyProperty
    3. Another maybe less used way is to raise the event manually, like this:
    public void Button_Click_1(object sender, RoutedEventArgs e)
    {
        myText = "Clicked";
        BindingOperations.GetBindingExpressionBase(myTextBox, TextBlock.TextProperty).UpdateTarget();
    }
    

    Note that your TextBlock has the confusing name myTextBox

    0 讨论(0)
  • 2021-01-01 01:47

    Your current myText property has no way of notifying the WPF binding system when its value has changed, so the TextBlock wont be updated.

    If you make it a dependency property instead it automatically implements change notification, and the changes to the property will be reflected in the TextBlock.

    So if you replace public string myText { get; set; } with all of this code it should work:

    public string myText
    {
        get { return (string)GetValue(myTextProperty); }
        set { SetValue(myTextProperty, value); }
    }
    
    // Using a DependencyProperty as the backing store for myText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty myTextProperty =
        DependencyProperty.Register("myText", typeof(string), typeof(Window1), new PropertyMetadata(null));
    
    0 讨论(0)
  • 2021-01-01 01:51

    You should implement INotifyPropertyChanged in your "MainWindow" so your "myTextBlock" can automatically pick up changes from your data and update.

    So your "MainWindow" should look like:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private string _myText;
    
        public string myText { 
          get{return _myText;}
          set{_myText = value;
             if(PropertyChanged!=null) PropertyChanged(this, new PropertyChangedEventArgs("myText")) ;
          }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        etc.....
    }
    
    0 讨论(0)
  • 2021-01-01 01:54

    Try this:

     public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;
            }
    
            public string myText { get; set; }
    
            public void Button_Click_1(object sender, RoutedEventArgs e)
            {
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += delegate
                {
                    int i = 0;
                    for (i = 0; i < 100; i++)
                    {
                        System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() => { myText = i.ToString(); OnPropertyChanged("myText"); }));                    
                        Thread.Sleep(100);
                    }
                };
    
                bw.RunWorkerAsync();
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
        }
    

    XAML file:

      <Grid>
                <Button Content="Button" HorizontalAlignment="Left" Height="106" Margin="71,95,0,0" VerticalAlignment="Top" Width="125" Click="Button_Click_1"/>
                <TextBlock x:Name="myTextBox" 
                           HorizontalAlignment="Right" Height="106" Margin="0,95,46,0" 
                           TextWrapping="Wrap" VerticalAlignment="Top" Width="187" 
                           Text= "{Binding myText}" />
    
            </Grid>
    
    0 讨论(0)
  • 2021-01-01 01:56

    implement INotifyPropertyChanged:

    public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public MainWindow()
            {
                this.InitializeComponent();
            }
    
            private string _txt;
            public string txt
            {
                get
                {
                    return _txt;
                }
                set
                {
                    if (_txt != value)
                    {
                        _txt = value;
                        OnPropertyChanged("txt");
                    }
                }
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                txt = "changed text";
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    

    XAML:

    <TextBox Text="{Binding txt}"/>
    <Button Click="Button_Click">yes</Button>
    

    and don't forget about adding the DataContext property of your window:

    <Window ... DataContext="{Binding RelativeSource={RelativeSource Self}}"/>
    
    0 讨论(0)
提交回复
热议问题