Что не так с моей привязкой WPF (в коде C #)? - PullRequest
1 голос
/ 01 декабря 2011

Я долгое время не использовал 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));
        }
    }
}

Когда приложение запускается, я получаю значение 99 на моем ProgressBar, так что привязка, кажется, работает, но затем она вообще не обновляется ...

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

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;

0 голосов
/ 01 декабря 2011

Во-первых, я не думаю, что ваше окно должно реализовывать INotifyPropertyChanged. Вы помещаете данные в свое окно. У вас должен быть отдельный класс, который реализует INotifyPropertyChanged, а затем установите его как DataContext для вашего окна. После этого вам нужно добавить Binding либо через код, либо в XAml, например:

<ProgressBar Name="Progress" Width="200" Height="20" Minimum="0" Maximum="100" Margin="10" Value="67" Value="{Binding MyInt}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...