2015-08-08 5 views
0

У меня есть категория со списком, которая привязана к ObservableCollection Categories на основе tbl_Category с двумя свойствами CategoryName и CategoryDescription. Теперь я хочу, чтобы добавить SelectedValue в ComboBox к продукту таблицы свойств Prod_CategoryWPF - Как получить выбранное значение, привязанное к модели таблицы

В моем конструкторе:

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

Combo коробка 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_Category до null даже сделав все это.

ответ

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 для уведомления пользовательского интерфейса, если какие-либо изменения происходят в одном из связных свойств

0

В дополнение к предоставленным @samthedev as 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 в качестве базового типа, который может происходить чаще, чем вы понимаете в WPF из-за наследования DataContext, когда кто-то что-то меняет на более высоком уровне.