Binding in TextBlock doesn't work in WPF

前端 未结 1 948
清酒与你
清酒与你 2020-12-21 18:42

I want to dynamically change TextBlock text in my Class.

XAML-Code:



        
相关标签:
1条回答
  • 2020-12-21 19:20

    If you are binding - why not just do it in XAML instead? Looking at your code it's kind of pointless - you might as well just go

    Footer_text.Text = "Setting";
    

    You should ideally do it in XAML or at least provide something for it to bind to

    <TextBlock Text="{Binding SomeProperty}" />
    

    I'm not sure why you would bind a 'string' on it's own to anything...do you have an object which you need to bind to the text property?

    Also using

    Binding("")
    

    What does that do? A blank path? Not sure what the binding target would be there... have you tried

    Binding()
    

    instead?

    Edit:

    Also the reason why your binding is not updating the control, is probably because you haven't bound to an object which implements INotifyPropertyChanged or a similar interface. The controls need to know when values have changed, so I'd imagine that binding to 'string' isn't giving the TextBlock the proper notification when it changes

    Edit 2:

    Here is a quick example of binding working:

    My window class Window.cs:

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <Grid>
            <StackPanel>
            <TextBlock x:Name="txtName" Text="{Binding Name}"></TextBlock>
                <Button Click="Button_Click">Click me 1</Button>
                <Button Click="Button_Click_1">Click me 2</Button>
            </StackPanel>
        </Grid>
    </Window>
    

    The code behind in Window.xaml.cs

    public partial class MainWindow : Window
    {
        SomeObjectClass obj = new SomeObjectClass();
        public MainWindow()
        {
            InitializeComponent();
    
            txtName.DataContext = obj;
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            obj.Name = "Hello World";
        }
    
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            obj.Name = "Goobye World";
        }
    }
    

    The object to bind to (with INotifyPropertyChanged)

    class SomeObjectClass : INotifyPropertyChanged
    {
        private string _name = "hello";
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
    

    Clicking the buttons changes SomeObject.Name, but it updates the textbox.

    0 讨论(0)
提交回复
热议问题