在组合框WPF中绑定SeteCEdItem

在组合框WPF中绑定SeteCEdItem,wpf,data-binding,mvvm,combobox,selecteditem,Wpf,Data Binding,Mvvm,Combobox,Selecteditem,我有一个带有ComboBox的UserControl <ComboBox Grid.Row="8" Grid.Column="1" VerticalAlignment="Center" x:Name="cmbCategory" ItemsSource="{Binding ElementName=ucAppiGeneralInfo, Path=Categories, Mode=TwoWay}"

我有一个带有ComboBox的UserControl

  <ComboBox Grid.Row="8" Grid.Column="1" 
             VerticalAlignment="Center"
              x:Name="cmbCategory"
              ItemsSource="{Binding ElementName=ucAppiGeneralInfo, Path=Categories, Mode=TwoWay}"
              SelectedItem="{Binding ElementName=ucAppiGeneralInfo, Path=SelectedCategory, Mode=TwoWay}"
              IsEditable="True"                            
              IsSynchronizedWithCurrentItem="True"     
              SelectedValuePath="CAT_ID"
              TextSearch.TextPath="CAT_NAME">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=CAT_NAME}"/>
                    <TextBlock Text=" - "/>
                    <TextBlock Text="{Binding Path=PUBLIC_DESCRIPTION}"/>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
我有一个使用UserControl的窗口:

 <TabControl>
        <TabItem Header="Information">
            <my:AppiGeneralInfoUC x:Name="ucAppiGeneralInfo" 
               Categories="{Binding Path=Categories, Mode=TwoWay}" 
              SelectedCategory="{Binding Path=SelectedCategory, Mode=TwoWay}" />
        </TabItem>
最后是ViewModel类:

  class AppiGeneralInfoVM : VMBase
{
    private DataTable categories = null;
    private String selectedCategory = null;

    public DataTable Categories
    {
        get { return this.categories; }
        set
        {
            this.categories = value;
            this.OnPropertyChanged("Categories");
        }
    }

    public String SelectedCategory
    {
        get { return this.selectedCategory; }
        set
        {                
            this.selectedCategory = value;               
            this.OnPropertyChanged("SelectedCategory");
        }
    }

    public AppiGeneralInfoVM()
    {
        ServicesLoader.LoadRunTimeServices();
        Categories = GetService<CategoryBLL>().getCategories();

    }

    public void setSelectedCategory(string cat_id)
    {
        SelectedCategory = Categories.Select("cat_id =" + "'"+cat_id+"'")[0]["CAT_NAME"].ToString();
    }
一切正常,但我对selectedItem SelectedCategory有问题,
这根本不是更新…

我认为这是因为SelectedItem具有字符串类型,而集合是枚举DataRow的DataTable。尝试将集合更改为IEnumerable

我从数据库获取所有数据,使用DataTable更方便。我最初选择editem作为DataRow,但它仍然不起作用。还有其他解决方案吗?您应该尝试从视图中抽象特定于数据库的内容。该视图可以与通过服务层返回的普通旧CLR对象POCO类交互。这通常称为数据传输对象,其主要目标是在服务及其客户端之间传输数据。
public partial class ApplicationWindow : Window
{
    VMBase appiGeneralInfoWin = new AppiGeneralInfoVM();

    public ApplicationWindow()
    {
        InitializeComponent();
        ucAppiGeneralInfo.DataContext = appiGeneralInfoWin;
    } 

  public void updateAction(string cat_id)
    {
        this.Title = "Update application";
        (appiGeneralInfoWin as AppiGeneralInfoVM).setSelectedCategory(cat_id);
    }  ...
  class AppiGeneralInfoVM : VMBase
{
    private DataTable categories = null;
    private String selectedCategory = null;

    public DataTable Categories
    {
        get { return this.categories; }
        set
        {
            this.categories = value;
            this.OnPropertyChanged("Categories");
        }
    }

    public String SelectedCategory
    {
        get { return this.selectedCategory; }
        set
        {                
            this.selectedCategory = value;               
            this.OnPropertyChanged("SelectedCategory");
        }
    }

    public AppiGeneralInfoVM()
    {
        ServicesLoader.LoadRunTimeServices();
        Categories = GetService<CategoryBLL>().getCategories();

    }

    public void setSelectedCategory(string cat_id)
    {
        SelectedCategory = Categories.Select("cat_id =" + "'"+cat_id+"'")[0]["CAT_NAME"].ToString();
    }