문제

런타임 후에 구현되기 때문에 새로운 UI 요소와 코드의 데이터 바인딩을 정의해야합니다. 다음은 내가하려는 일의 단순화 된 버전입니다.

데이터 모델 :

public class AddressBook : INotifyPropertyChanged
{
    private int _houseNumber;
    public int HouseNumber
    {
        get { return _houseNumber; }
        set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string sProp)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(sProp));
        }
    }
}

코드의 바인딩 :

AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456; // Text block displays "123" but PropertyChanged event fires

데이터가 먼저 바운드되면 텍스트 블록은 올바른 집 번호로 업데이트됩니다. 그런 다음 나중에 코드로 집 번호를 변경하면이 책의 속성 변경 이벤트가 발생하지만 텍스트 블록은 업데이트되지 않습니다. 누구든지 이유를 말해 줄 수 있습니까?

감사합니다, 벤

도움이 되었습니까?

해결책

그것의 근본은 내가 PropertyChangeDeventArgs에 전달한 줄이 속성의 이름과 정확히 일치하지 않았다는 것입니다. 나는 다음과 같은 것을 가지고 있었다 :

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNum"); }
}

어디에 있어야하는지 :

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}

이키스! 올바른 방향으로 밀어 주셔서 감사합니다.

다른 팁

업데이트하고 있는지 확인하십시오 AddressBook 바인딩에 사용 된 참조, 그리고 다른 사람이 아닙니다. AddressBook 참조.

나는 당신이 준 주소록 코드로 작업하기 위해 다음을 얻었습니다.

<StackPanel>
    <Button Click="Button_Click">Random</Button>
    <Grid x:Name="myGrid">
    </Grid>
</StackPanel>

뒤에 코드 :

public partial class Window1 : Window
{
    private AddressBook book;

    public Window1()
    {
        InitializeComponent();

        book = new AddressBook();
        book.HouseNumber = 13;

        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        tb.SetBinding(TextBlock.TextProperty, bind);
        myGrid.Children.Add(tb);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Random rnd = new Random();
        book.HouseNumber = rnd.Next();
    }
}

참고 업데이트 코드에서 동일한 참조가 사용됩니다.

바인딩 모드를 프로그래밍 방식으로 설정해야합니까? 일시적으로 불이행 될 수 있습니다.

방금 자르고 코드를 붙여 넣었고 (조금 추가), 그것은 나에게 잘 작동합니다.

    public Window1()
    {
        InitializeComponent();

        AddressBook book = new AddressBook();
        book.HouseNumber = 123;
        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        bind.Mode = BindingMode.OneWay;
        tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
        myGrid.Children.Add(tb);
        book.HouseNumber = 456; 
    }

    private void TestButton_Click(object sender, RoutedEventArgs e)
    {
        AddressBook book = 
           (AddressBook(TextBlock)
              myGrid.Children[0])
              .GetBindingExpression(TextBlock.TextProperty)
              .DataItem;

        book.HouseNumber++;
    }

시작시 456을 표시하면 버튼을 클릭하면 텍스트 블록의 숫자가 잘됩니다.

아마도 당신은 문제의 원인을 위해 잘못된 장소를 찾고 있습니까?

바인딩에서 사용한 것과 동일한 객체를 업데이트하고 있다고 확신하십니까? 언뜻보기에 아무것도 잘못 보이지 않으므로 간단한 것을 확인하십시오. :)

모든 코드는 속성을 우회하고 필드를 설정합니다 (_houseNumber) 곧장?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top