WPF - 如何获取绑定到 table 模型的选定值
WPF - How to get selected value binded to a table model
我有一个组合框类别绑定到基于 tbl_Category
的 ObservableCollection Categories
,具有两个属性 CategoryName
和 CategoryDescription
。现在我想将 ComboBox
的 SelectedValue
添加到产品 table 属性 Prod_Category
在我的构造函数中:
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_Category
到 null
。
您应该使用 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
除了@samthedev 提供的答案之外,我还建议您将 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 继承。
我有一个组合框类别绑定到基于 tbl_Category
的 ObservableCollection Categories
,具有两个属性 CategoryName
和 CategoryDescription
。现在我想将 ComboBox
的 SelectedValue
添加到产品 table 属性 Prod_Category
在我的构造函数中:
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_Category
到 null
。
您应该使用 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
除了@samthedev 提供的答案之外,我还建议您将 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 继承。