문제

SL 페이지에 두 개의 콤보 상자가 있습니다. 콤보 1 업데이트되면 서비스가 호출되고 콤보 2를 채 웁니다.

첫 번째 호출에서 3 개의 결과가 반환됩니다. 콤보 상자가 확장되면 3 가지 옵션을 모두 볼 수 있습니다.

두 번째 호출에서 4 개의 결과가 반환됩니다. 콤보 상자가 확장되면 세로 스크롤 막대와 함께 3 가지 옵션이 표시됩니다.

다시로드하고 그 단계를 반대로 수행하면 두 번째 호출에서 첫 번째 호출과 3 행 + 빈 행을 얻습니다. (아니요, 빈은 레코드가 아닙니다. 선택할 수 없습니다.)

드롭 다운 목록 크기는 첫 번째 생성 높이를 유지하는 것으로 보입니다.

각 서비스 호출 후 표시된 콤보 박스 최대 항목을 새로 고치는 방법은 무엇입니까?

감사!

#1 편집

코드는 MV-VM 패턴을 따릅니다. 페이지가로드되면 Group1 첫 번째 콤보 상자를 채우면 아무것도 선택되지 않습니다. 사용자가 선택을 할 때 해당 선택은 Group1Selection에 바인딩됩니다.

<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" />
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" />

뷰 모델에서 Group1Selection 속성, 나는 같은 것을 가지고 있습니다

set
{
    if (group1Selection != value)
    {
        group1Selection = value;
        PopulateGroup2();
        OnPropertyChanged("Group1Selection");
    }
}

PopulateGroup2가 내 서비스 호출 Async를 수행하고 데이터를 가져오고 해당 데이터를 노출 된 속성에 넣습니다. Group2.

"정상적인"조건에서는 대부분의 옵션에 수십 개의 가능한 선택이 있기 때문에 이것은 문제가되지 않습니다. 그러나 몇 가지 Group1 선택에는 3 ~ 4 개의 자녀 선택 만 있습니다. 그 중 하나가 먼저 선택되면, 그 응용 프로그램 인스턴스의 나머지 부분에 대해 Combobox의 높이는 각각 8 개의 표시된 항목에서 최대화하는 대신 각각 3 또는 4로 설정됩니다.

MV-VM 패턴에 따라 코드-비만에는 코드가 없습니다.

도움이 되었습니까?

해결책

이것은 Silverlight 2의 Combobox에서 알려진 버그입니다. 나는 그것이 SL 3에 고정되었다고 생각합니다.

다음을 수행 하여이 문제를 해결할 수 있습니다.

  1. Combobox에서 상속

    공개 클래스 Mycombobox : Combobox

  2. onapplytemplate () 메소드 내부의 Combobox의 "팝업"부분에 대한 참조를 얻으십시오.

        Popup thePopup = GetTemplateChild("Popup") as Popup;
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
    
  3. OnitemSChanged 메소드를 무시하십시오

  4. 재정의 된 OnitemSchagned 메소드 내부는 ClearValue (DP) 메소드를 사용하여 팝업의 높이 및 너비 종속성 속성을 재설정합니다.

            thePopupContent.ClearValue(FrameworkElement.WidthProperty);
            thePopupContent.ClearValue(FrameworkElement.HeightProperty);
    

그것들에 대해 걱정하는 경우 최대 및 최소 높이 및 너비 속성을 지울 수 있습니다.

다른 팁

그것은 완벽한 솔루션이었습니다. Markti 감사합니다.

관심있는 사람들을 위해 수업은 다음과 같습니다.

using System.Windows.Controls.Primitives; 

public class WorkAroundComboBox: ComboBox
{
    FrameworkElement thePopupContent;

    public override void OnApplyTemplate()
    {
        Popup thePopup = GetTemplateChild("Popup") as Popup;
        thePopupContent = thePopup.Child as FrameworkElement;
        base.OnApplyTemplate();
    }

    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        thePopupContent.ClearValue(FrameworkElement.WidthProperty);
        thePopupContent.ClearValue(FrameworkElement.HeightProperty);
        base.OnItemsChanged(e);
    }
}

}

문제는 Silverlight가 Combobox 2의 데이터가 변경되었다는 것을 완전히 인식하지 못한다고 생각합니다. 추가 해보세요 OnPropertyChanged("Group2") 세트에 Group1 - Silverlight가 Combobox 2의 바인딩을 업데이트해야한다는 것을 깨닫는 데 도움이됩니다.

또한 전화하는 데 도움이 될 수 있습니다 OnPropertyChanged ~을 위한 Group2Selection, 이전 값은 더 이상 유효하지 않기 때문입니다.

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