2011-01-18 2 views
0

ItemTemplate이 사용자 정의 레이블 컨트롤 중 하나를 포함하는 DataTemplate에 바인딩 된 Combobox가 있습니다. 모든 사용자 지정 컨트롤은 할당 된 내용을 지역화합니다.Silverlight Combobox ItemTemplate Stuck 첫 번째 선택된 항목 표시

콤보 박스 (닫힌 상태)는 선택한 첫 번째 항목의 텍스트를 표시합니다. 그러나 선택한 항목이 변경되면 닫힌 콤보 박스의 표시가 업데이트되지 않습니다. 나는 그것이 실제로 바뀌는 속성에 묶여 있기 때문에 실제 선택된 항목이 업데이트된다는 것을 안다. 유일한 문제는 표시 텍스트입니다.

예를 들어 '항목 1'텍스트가있는 항목을 선택하면 닫힌 콤보 박스가 '항목 1'을 표시합니다. 그런 다음 '품목 2'를 선택하면 닫힌 콤보 상자에는 '품목 1'이 계속 표시됩니다.

public class MyLabel : Label 
{ 
    /// <summary> 
    /// When reassigning content in the OnContentChanged method, this will prevent an infinite loop. 
    /// </summary> 
    private bool _overrideOnContentChanged; 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     // if this method has been called recursively (since this method assigns content) 
     // break out to avoid an infinite loop 
     if (_overrideOnContentChanged) 
     { 
      _overrideOnContentChanged = false; 
      return; 
     } 

     base.OnContentChanged(oldContent, newContent); 

     var newContentString = newContent as string; 
     if (newContentString != null) 
     { 
      // convert the string using localization 
      newContentString = LocalizationConverter.Convert(newContentString); 

      // override the content changed method 
      // will prevent infinite looping when this method causes itself to be called again 
      _overrideOnContentChanged = true; 
      Content = newContentString; 
     } 
    } 
} 

모든 : 아래

<Grid.Resources> 
    <DataTemplate x:Key="MyTemplate"> 
     <MyCustomLabel Content="{Binding Name}" /> 
    <DataTemplate> 
</Grid.Resources> 

<Combobox ItemsSource="{Binding MyItems}" ItemTemplate="{StaticResource MyTemplate}" /> 

내 레이블 컨트롤에 대한 코드입니다 : 여기

가이 설정 어떻게입니다 ('이름'항목의 속성 ItemsSource에 바인딩되고있다) 조언은 크게 감사하겠습니다. 감사!

+0

콤보 상자에서 변경해야하는 레이블이 아닙니다. 콤보 상자는 ItemsSource의 각 항목에 대한 레이블을 생성합니다. – Maciek

답변

0

콤보 상자의 SelectedItem 속성에 대해 양방향 데이터 바인딩을 수행하십시오.

콤보 상자를 바인딩하는 대상 속성은 PropertyChanged 이벤트를 발생시켜야합니다.

<ComboBox ItemsSource={Binding Path=Source} SelectedItem={Binding Path=CurrentItem, Mode=TwoWay}/> 


class ComboContext : INotifyPropertyChanged 
{ 
public List<object> Source { get; set; } // attach your source here 
public object CurrentItem { get { return mCurrentItem; } set { mCurrentItem = value; OnPropertyChanged("CurrentItem"); } } // bind to this property 
private object mCurrentItem; 

void OnPropertyChanged(string name) 
{ 
if(PropertyChanged != null) 
PropertyChanged(this, new PropertyChangedEventArgs(name)); 
} 
} 

코드 샘플은 "완전"하지 않을 수 있습니다 - 그것은 오전 1시 그리고 내가 좀 피곤하지만 바른 길에 당신을 둘 것이다.

편집 2.

그냥 템플릿에 주목했습니다. 틀렸어. 전체 아이디어가 잘못되었습니다. texblock의 텍스트가, 어떤 경로로 결합이다

<ComboBox ItemsSource={Binding Path=Source} SelectedItem={Binding Path=CurrentItem, Mode=TwoWay}> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <TextBlock Text={Binding}/> 
     </Grid> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

공지 사항 (그리고 너무 바인딩 기본이다가.)이 된 본체는 "아래에"직접 무엇이든에 결합 할 것이라는 어떠한 경로 바인딩 없음을 의미합니다.

+0

두 가지. 하나 : ComboBox의 SelectedItem 속성을 바인딩하는 데 문제가 없습니다. 예제를 깔끔하게 유지하기 위해이 부분을 떠났습니다. 2 : 내 예제는 정상적인 Label 컨트롤로 잘 작동합니다. 문제가 발생하는 맞춤 라벨 컨트롤을 사용할 때만입니다. 나는 그것이 왜 사용자 정의 컨트롤을 사용할 때만 실패하는지 궁금합니다. 답장을 보내 주셔서 감사합니다. – user326502