2016-06-23 86 views
1

在我的组合框中,我有几种不同的从数据库加载的不同语言(通过绑定)。当组合框中的选择更改为不同的语言,并且用户单击确定按钮时,我想要做一些简单的操作,例如显示一个新窗口。我想用WPF Commands(Name_CanExecute和Name_Executed)来实现。我昨天整天都在玩,并且无法使其工作。我是Wpf和MVVM模式的新手。当WPF组合框发生变化时触发命令

如果有人能告诉我如何去做,我会非常感激。任何帮助表示赞赏。

enter image description here

在查看我的的.xaml代码看起来是这样的:

<UserControl x:Class="***.***.Modules.Localization.Views.LocalizationManager" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:***.***.Modules.Localization.Services" 
     xmlns:viewModels="clr-namespace:***.***.Modules.Localization.ViewModels" 
     Height="270" Width="230" 
     mc:Ignorable="d"> 
<UserControl.Resources> 
    <viewModels:LocalizationViewModelLocator x:Key="LocalizationViewModelLocator"/> 
</UserControl.Resources> 
<UserControl.DataContext> 
    <Binding Mode="OneWay" Path="LocalizationViewModel" Source="{StaticResource LocalizationViewModelLocator}"/> 
</UserControl.DataContext> 

<Grid Background="Gainsboro"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="10,10"> 
     <TextBlock FontSize="13" FontFamily="Verdana" Text="Language: " /> 

     <ComboBox Name="CboLanguageSelector" BorderThickness="1" MinWidth="105" ItemsSource="{Binding Languages}" /> 

     <Button>OK</Button> 

    </StackPanel> 
</Grid> 

和我代码视图模型看起来是这样的:

public class LocalizationViewModel : LocalizableViewModel 
    { 
     //the available languages from database are saved here 
     public ObservableCollection<string> Languages { get; private set; } 
     private readonly IDataAccessUnitOfWorkFactory dataAccessUnitOfWorkFactory; 
     public LocalizationViewModel(ILocalizationService localizationService, 
           IDataAccessUnitOfWorkFactory dataAccessUnitOfWorkFactory) : base(localizationService) 
    { 
     this.dataAccessUnitOfWorkFactory = dataAccessUnitOfWorkFactory; 
     LoadLanguagesFromCtlangTable(); 

    } 
    /// <summary> 
    /// Get the available languages from the CTLANG table 
    /// </summary> 
    private void LoadLanguagesFromCtlangTable() 
    { 
     using (var unitOfWork = dataAccessUnitOfWorkFactory.Create()) 
     { 
      string query = "SELECT languagename FROM ctlang ORDER BY languagename"; 
      Languages = new ObservableCollection<string>(unitOfWork.OwEntities.Database.SqlQuery<string>(query)); 
     } 
    } 
    //Implement Command_Execute and Command_CanExecute 


} 
+0

[你如何处理MVVM中的ComboBox SelectionChanged?](http://stackoverflow.com/questions/950501/how-do-you-handle-a-combobox-selectionchanged-in-mvvm) – JanDotNet

回答

2

ComboBox.SelectedItem绑定到您的视图模型上的一个属性,然后在您的命令中,您可以只读取该属性值,不需要额外的事件。如果你没有单独的命令,只想在更改时执行代码:将所述代码放在绑定属性的setter中。

+0

我会研究你的答案,之后我会在这里发表我是如何解决问题的。谢谢 – Devid

相关问题