2011-04-26 44 views
0

获取组合框元素到每个支持Command和CommandParameter的最佳方式是什么?Silverlight组合框 - 带命令的项目

我想实现this blog post底部显示的主题选取器,除了使用组合框而不是上下文菜单。我需要组合框的每个元素来支持Command和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

你真的需要使用一个命令或者你只是想访问的变化触发您的视图模型? – bendewey 2011-04-26 16:51:14

+0

我正在尝试动态更改SL Toolkit主题。在思考这个问题时,我想我可以捕获SelectedItemChanged(或其他)事件,并从后面的代码手动执行。尽管这个特定的问题很可能是没有意义的,但实际上是否可以将CB项绑定到命令? – 2011-04-26 17:01:59

+0

我问的原因是因为你可以将SelectedItem属性绑定到ComboBox,然后你的ViewModel可以收听setter。如果您有兴趣,我会将其添加为答案。 – bendewey 2011-04-26 17:41:20

回答

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"); 
    } 
}