Код связывания WPF C # - почему этот простой пример не работает? - PullRequest
3 голосов
/ 08 сентября 2010

Я приложил код связывания WPF C # - почему этот простой пример не работает?(просто пытаюсь понять привязку к пользовательскому объекту).То есть при нажатии на кнопку увеличения счетчика в модели метка не обновляется.

<Window x:Class="testapp1.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>
        <Button  Height="23" HorizontalAlignment="Left" Margin="20,12,0,0" 
                 Name="testButton" VerticalAlignment="Top" Width="126" 
                 Click="testButton_Click" Content="Increase Counter" />
        <Label Content="{Binding Path=TestCounter}" Height="37" 
               HorizontalAlignment="Right" Margin="0,12,122,0" 
               Name="testLabel2" VerticalAlignment="Top" 
               BorderThickness="3" MinWidth="200"  />
    </Grid>
</Window>


namespace testapp1
{
    public partial class MainWindow : Window
    {
        public TestModel _model;

        public MainWindow()
        {
            InitializeComponent();

            InitializeComponent();
            _model = new TestModel();
            _model.TestCounter = 0;
            this.DataContext = _model;
        }

        private void testButton_Click(object sender, RoutedEventArgs e)
        {
            _model.TestCounter = _model.TestCounter + 1;
            Debug.WriteLine("TestCounter = " + _model.TestCounter);
        }
    }

    public class TestModel : DependencyObject
    {
        public int TestCounter { get; set; }
    }

}

спасибо

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

Для этого простого примера рассмотрите возможность использования INotifyPropertyChanged, а не DependencyProperties!

ОБНОВЛЕНИЕ Если вы хотите использовать DP, используйте фрагмент propdp в VS2010 или фрагменты Dr WPF дляVS2008

3 голосов
/ 08 сентября 2010

TestCounter должен быть DepenencyProperty

    public int TestCounter
    {
        get { return (int)GetValue(TestCounterProperty); }
        set { SetValue(TestCounterProperty, value); }
    }

    // Using a DependencyProperty as the backing store for TestCounter.  
    //This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TestCounterProperty =
        DependencyProperty.Register
             ("TestCounter", 
              typeof(int), 
              typeof(TestModel), 
              new UIPropertyMetadata(0));
1 голос
/ 12 сентября 2010

Вы можете реализовать интерфейс INotifyPropertyChanged в пространстве имен System.ComponentModel.Я обычно реализую метод Changed, который может принимать несколько имен свойств и проверять, не установлено ли событие.Я делаю это потому, что иногда у меня есть несколько свойств, которые зависят от одного значения, и я могу вызвать один метод из всех моих установщиков свойств.

Например, если у вас есть класс Rectangle со свойствами Width и Height и чтение Area-только свойство, которое возвращает ширину * высоту, вы можете поставить измененным («ширина», «площадь»);в установщике свойств для Width.

public class TestModel : INotifyPropertyChanged
{
    int m_TestCounter;
    public int TestCounter {
        get {
            return m_TestCounter;
        }
        set {
            m_TestCounter = value;
            Changed("TestCounter");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    void Changed(params string[] propertyNames)
    {
        if (PropertyChanged != null)
        {
            foreach (string propertyName in propertyNames)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...