2015-08-08 101 views
0

我有一个组合框类别绑定到ObservableCollection Categories基于tbl_Category与两个属性CategoryNameCategoryDescription。现在我想的ComboBoxSelectedValue添加到产品表属性Prod_CategoryWPF - 如何将选定的值绑定到表模型

在我的构造函数:

cb.DataContext = Categories; 
this.DataContext = new tbl_Product(); 

组合框XAML:

<Combobox x:Name="cb" ItemSource="{Binding Categories}" DisplayMemberPath="CategoryName" SelectedValuePath="CategoryName" SelectedValue="{Binding Prod_Category,Mode=TwoWay}"/> 

在我保存产品事件:

tbl_Product prod = (tbl_Product)this.DataContext; 
DataOperations.AddProduct(prod); 

我得到Prod_Categorynull甚至在做完所有这些之后。

回答

2

您应该使用SelectedItem而不是SelectedValue,请参阅this

除此之外,你愿意做就没有那么清楚,我试图实现你问基于我的理解

public partial class MainWindow : Window,INotifyPropertyChanged 
{ 
    private ObservableCollection<Category> _categories; 
    public ObservableCollection<Category> Categories 
    { 
     get 
     { 
      return _categories; 
     } 

     set 
     { 
      if (_categories == value) 
      { 
       return; 
      } 

      _categories = value; 
      OnPropertyChanged(); 
     } 
    } 
    private Category _prod_Category ; 
    public Category Prod_Category 
    { 
     get 
     { 
      return _prod_Category; 
     } 

     set 
     { 
      if (_prod_Category == value) 
      { 
       return; 
      } 

      _prod_Category = value; 
      OnPropertyChanged(); 
     } 
    } 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     Categories=new ObservableCollection<Category>() 
     { 
      new Category() 
      { 
       CategoryName = "Name1", 
       CategoryDescription = "Desc1" 
      },new Category() 
      { 
       CategoryName = "Name2", 
       CategoryDescription = "Desc2" 
      } 
     }; 
    } 

    public void SaveButton_Click(object sender, RoutedEventArgs routedEventArgs) 
    { 
     if (Prod_Category!=null) 
     { 
      //add it to whatever you want 

     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class Category 
{ 
    public String CategoryName { get; set; } 
    public String CategoryDescription { get; set; } 
} 

和XAML什么

<StackPanel> 
    <ComboBox x:Name="cb" ItemsSource="{Binding Categories}" DisplayMemberPath="CategoryName" SelectedValuePath="CategoryName" SelectedItem="{Binding Prod_Category,Mode=TwoWay}"/> 
    <Button Content="Save" Click="SaveButton_Click"></Button> 
</StackPanel> 

你应考虑实施INotifyPropertyChanged界面来通知UI是否有任何绑定属性发生变化

0

除了@samthedev提供的ans WER,我也建议你改变你的DataContext分配:

tbl_Product prod = (tbl_Product)this.DataContext; 
DataOperations.AddProduct(prod); 

tbl_Product prod = this.DataContext as tbl_Product; 
if (tbl_Product != null) 
{ 
    DataOperations.AddProduct(prod); 
} 

这可以防止的DataContext的任何变化被意外地绑定到不同的对象,并导致未处理的异常是由于事实上DataContext确实有tbl_Product作为它的基类型,由于DataContext在更高级别更改某些内容时继承,因此它可能比WPF中实现的更频繁。

相关问题