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.