我很长时间没有使用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值,所以绑定似乎可以工作但是,它根本不刷新...
答案 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}"/>