WPF 바인딩을 강제로 새로 고치는 방법은 무엇입니까?


112

간단한 바인딩을 사용하여 첨부 된 항목 소스가있는 콤보 상자가 있습니다. 콤보 상자가로드되면이 바인딩을 새로 고칠 수있는 방법이 있습니까?


1
단순 바인딩이란 무엇을 의미합니까? 일반적으로 바인딩을 사용하면 컨트롤이 자동으로 새로 고쳐집니다.
Erno 2011-04-15

12
Techee, 위반은 아니지만 HB가 그의 대답을 받아 들일 가치가 있다고 생각합니다 ;-)
Dani

1
그는에 기록 된 이후 6.5 년 - @Dani 나는 Techee 다시 돌아오고있다 확실하지 않다
외로운 코더

답변:


198

바인딩 표현식을 사용할 수 있습니다.

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

그러나 Blindmeis가 언급했듯이 변경 알림을 실행할 수도 있습니다. 또한 컬렉션이 구현되면 INotifyCollectionChanged(예 :에서 구현 됨 ObservableCollection<T>) 동기화 되므로이 작업을 수행 할 필요가 없습니다.


ListBox를 사용하여 나를 위해 일을하지 않는 것 같습니다.
Jonathan Wood

@JonathanWood : 글쎄, 나는 당신의 바인딩이 어떻게 생겼는지 포함하여 당신이 가지고있는 코드의 종류를 신성화 할 수 없습니다. 바인딩이 처음부터 작동합니까?
HB

56

mvvm을 사용하고 itemssource가 VM에있는 경우. 새로 고치고 싶을 때 컬렉션 속성에 대해 INotifyPropertyChanged를 호출하면됩니다.

OnPropertyChanged("YourCollectionProperty");

7
이것은 가장 깨끗한 접근 방식입니다.
Ash

가능하면이 작업을 수행해야하지만 항상 실용적이지는 않습니다. 예를 들어 직렬 포트에 바인딩하고 열려 있는지, 닫혀 있는지, 전송 속도 등을 확인하려면을 구현하는 직렬 포트 주위에 래퍼 클래스를 만들 수 INotifyPropertyChanged있지만 포트를 비공개로 유지해야합니다. 그 래퍼를 사용하므로 알리려는 속성이 항상 래퍼를 통과하도록 프로젝트의 다른 곳에서 사용하는 해당 포트의 모든 항목에 대한 속성과 메서드를 작성해야합니다
Assimilater

8
또한 나는 nameof(YourCollectionProperty)리터럴 문자열과는 반대로 사용하는 것을 좋아 합니다. 이렇게하면 버그가 리팩토링되는 것을 방지하고 실제로 의도 한 내용이 더 명확 해집니다. 물론 이것은 CallerMemberName더 좋은 속성을 사용할 수없는 곳입니다
Assimilater

31

2 센트를 추가하려면 데이터 소스를 새 컨트롤 값으로 업데이트하려면 UpdateSource()대신 UpdateTarget()다음 을 호출해야합니다 .

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
이 답변이 더 좋습니다.
Chopnut

8

MultiBinding 친화적 버전 ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

백엔드에서 데이터를 가져오고 한 줄의 코드로 화면을 업데이트했습니다. 효과가있었습니다. 왜 우리가 Interface를 구현해야하는지 잘 모르겠습니다. (Windows 10, UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update ()는 화면의 모든 바인딩을 새로 고칩니다. FYI
Itzdsp

UWP의 usercontrol에서 this.Bindings.Update ()를 시도했지만 존재하지 않습니다.
제임스 환경 안전 보건

예. 그리고 this.Bindings는 여전히 존재하지 않습니다.
제임스 환경 안전 보건

2
사용 ... 그리고 컴파일 된 바인딩 만 UWP에서 사용할 수 있습니다 : Bindings.Update ()는 컴파일 된 바인딩 (바인딩 x는) 경우에만 사용할 수 있습니다
마리아 Dolinský

@ MarianDolinský 코멘트를 살펴보십시오. 당신 같은 외모는 XAML에서 바인딩이
Itzdsp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.