我的WPF绑定有什么问题(在C#代码中)?

时间:2011-12-01 14:28:46

标签: c# wpf binding

我很长时间没有使用WPF,所以我很确定这对你们大多数人来说都是一个简单的问题,但这里是我的xaml代码:

<Grid>
    <ProgressBar Name="Progress" Width="200" Height="20" Minimum="0" Maximum="100" Margin="10"/>
</Grid>

这是C#代码:

namespace WpfApplication1
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private int _MyInt;
        public int MyInt
        {
            get { return _MyInt; }
            set
            {
                _MyInt = value;
                RaisePropertyChanged("MyInt");
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            MyInt = 99;

            Random random = new Random();
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += (sender, e) =>
            {
                MyInt = random.Next(0, 100);
            };
            aTimer.Interval = 500;
            aTimer.Enabled = true;

            Binding b = new Binding();
            b.Source = MyInt;
            b.Mode = BindingMode.OneWay;
            Progress.SetBinding(ProgressBar.ValueProperty, b);
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

当应用程序启动时,我的ProgressBar上有一个99值,所以绑定似乎可以工作但是,它根本不刷新...

2 个答案:

答案 0 :(得分:3)

Progress.Value = MyInt只是将值设置为MyInt中的当前值。这与绑定值不同,这意味着该值将指向MyInt,而不是MyInt的副本

要在代码隐藏中创建绑定,它看起来像这样:

Binding b = new Binding();
b.Source = this;
b.Path = new PropertyPath("MyInt");
Progress.SetBinding(ProgressBar.ValueProperty, b);

另一种方法是绑定XAML中的值并根据需要进行更新:

<ProgressBar Name="Progress" Value="{Binding MyInt}" />

然后在后面的代码中:MyInt = newValue;

答案 1 :(得分:0)

首先,我不认为您的窗口应该实现INotifyPropertyChanged。 您将数据放在窗口中。您应该有一个单独的类来实现INotifyPropertyChanged,然后将其设置为您的Window的DataContext。之后,您需要通过代码或XAml添加Binding,如下所示:

<ProgressBar Name="Progress" Width="200" Height="20" Minimum="0" Maximum="100" Margin="10" Value="67" Value="{Binding MyInt}"/>