2011-04-26 4 views
0

콤보 박스의 각 요소를 Command 및 CommandParameter를 지원하는 가장 좋은 방법은 무엇입니까?실버 라이트 콤보 박스 - 명령이있는 항목

컨텍스트 메뉴 대신 콤보 상자를 제외하고 this blog post 아래쪽에 표시된 테마 선택기를 구현하고 싶습니다. 커맨드와 CommandParameter를 지원하기 위해서는 콤보 박스의 각 요소가 필요합니다. 아래의 콤보와 같이 평범한 텍스트로 만들고 싶습니다.

 <ComboBox> 
      <ComboBox.Items> 
       <TextBlock>A</TextBlock> 
       <TextBlock>B</TextBlock> 
       <TextBlock>C</TextBlock> 
      </ComboBox.Items> 
     </ComboBox> 

하이퍼 링크를 시도했지만 주요 문제는 링크 텍스트를 직접 클릭하면 콤보 상자가 닫히지 않는다는 것입니다.

쉬운 방법이 있나요?

편집

좋아, 그럼 내가하고 싶었 말했다 특정 목표 달성 가지는 콤보는 SL 툴킷을 변경 테마입니다 하찮게 달성. 콤보의 선택된 항목을 ViewModel 속성에 바인드하여 내 SL Toolkit 테마가 바인딩 할 수있는 적절한 themeuri를 노출하거나 순수한 비즈니스 로직이없는 UI 활동이므로 콤보 박스 항목을 잡을 수 있습니다 변경된 이벤트 및 거기에서 내 themeUri를 업데이트하십시오.

궁금한데, 각 콤보 상자 항목을 명령 매개 변수가있는 명령에 바인딩하는 좋은 방법이 있습니까? 각 comboboxItem이 하이퍼 링크를 사용하면 유망한 것처럼 보였지만 실제 하이퍼 링크를 클릭 할 때 항목을 클릭하면 CB가 닫히지 않습니다.

+0

당신이 정말로 명령을 사용할 필요가 또는 당신은 단지에 변경 트리거에 액세스하려고 마십시오 ViewModel? – bendewey

+0

SL Toolkit Theme을 동적으로 변경하려고합니다. 이것에 대해 좀 더 생각해 보면 SelectedItemChanged (또는 무엇이든) 이벤트를 잡아서 코드 뒤에서 수동으로 할 수 있다고 생각합니다. 이 특별한 질문은 논쟁의 여지가 있지만 CB 항목을 명령에 바인딩 할 수 있습니까? –

+0

내가 묻는 이유는 ComboBox에 SelectedItem 속성을 바인딩하기 만하면 ViewModel이 setter를들을 수 있기 때문입니다. 관심이 있으시면 답변으로 추가하겠습니다. – bendewey

답변

3

선택한 항목을 ViewModel에 바인딩하면 테마가 변경 될 때 설정자가 트리거됩니다.

XAML :

<ComboBox SelectedItem="{Binding SelectedTheme, Mode=TwoWay}" ItemsSource="{Binding Themes}" /> 

코드 숨김 :

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     DataContext = new MainPageViewModel(); 
    } 
} 

뷰 모델 :

public class MainPageViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<string> Themes { get; set; } 

    private string _selectedTheme; 
    public string SelectedTheme 
    { 
     get { return _selectedTheme; } 
     set 
     { 
      _selectedTheme = value; 
      // Change the Theme 
      RaisePropertyChanged("SelectedTheme"); 
     } 
    } 

    public MainPageViewModel() 
    { 
     Themes = new ObservableCollection<string>(); 
     Themes.Add("Red"); 
     Themes.Add("Green"); 
     Themes.Add("Blue"); 
    } 
} 
관련 문제