我正在一个项目中,我需要从对象列表中选择一个值,然后根据所做的选择以及所选对象的属性来更新同一行中显示的其他值。我将VM中的列表(使用Prism)绑定到了DataGridComboBoxColumn,并且工作正常,但是没有可以绑定到的事件SelectionChanged。我实际上正在使用Telerik的RadDataGrid,我的代码是:
<telerikGrid:RadDataGrid x:Name="ArticlesDataGrid" Margin="0,8,0,0"
ItemsSource="{x:Bind MasterMenuItem.Articles, Mode=TwoWay}" UserEditMode="Inline" UserGroupMode="Disabled" AutoGenerateColumns="False">
<telerikGrid:RadDataGrid.Columns>
<telerikGrid:DataGridComboBoxColumn PropertyName="Code" ItemsSource="{x:Bind ViewModel.Articles}" DisplayMemberPath="Code" SelectedValuePath="Code" />
<telerikGrid:DataGridComboBoxColumn PropertyName="Description" ItemsSource="{x:Bind ViewModel.Articles}" DisplayMemberPath="Description" SelectedValuePath="Description" />
<telerikGrid:DataGridTextColumn PropertyName="MeasureUnit.Description" CanUserEdit="False" />
<telerikGrid:DataGridTextColumn PropertyName="VatCode.Description" CanUserEdit="False"/>
<telerikGrid:DataGridTextColumn PropertyName="Price" CanUserEdit="False"/>
<telerikGrid:DataGridTextColumn PropertyName="Quantity" />
<telerikGrid:DataGridTextColumn PropertyName="Total" CanUserEdit="False" />
</telerikGrid:RadDataGrid.Columns>
</telerikGrid:RadDataGrid>
我需要在更改描述或代码列时,可以更新同一行其他列中的内容。 有人可以指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
您不需要SelectionChanged事件。您只需要使模型类实现INotifyPropertyChanged Interface,当DataGridComboBoxColumn的值更改时,模型对象的属性值也将更改。然后,您可以在其中更改其他属性的值。
由于您还没有提供代码隐藏代码,因此我仅提供一个简单的代码示例供您参考:
<telerikGrid:RadDataGrid x:Name="ArticlesDataGrid" Margin="0,8,0,0"
ItemsSource="{x:Bind ViewModel}" UserEditMode="Inline" UserGroupMode="Disabled" AutoGenerateColumns="False" >
<telerikGrid:RadDataGrid.Columns>
<telerikGrid:DataGridComboBoxColumn PropertyName="Option" ItemsSourcePath="Options" />
<telerikGrid:DataGridTextColumn PropertyName="Total" CanUserEdit="False" />
</telerikGrid:RadDataGrid.Columns>
</telerikGrid:RadDataGrid>
public class Test : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
private int _Total;
public int Total
{
get { return _Total; }
set
{
if (_Total != value)
{
_Total = value;
RaisePropertyChanged("Total");
}
}
}
private string _Option;
public string Option
{
get { return _Option; }
set
{
if (_Option != value)
{
_Option = value;
switch (value)
{
case "option1":this.Total = 1;break;
case "option2": this.Total = 2;break;
default: this.Total = 0;break;
}
RaisePropertyChanged("Option");
}
}
}
public ObservableCollection<string> Options { get; set;}
}
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
ViewModel = new ObservableCollection<Test>();
ViewModel.Add(new Test() {Total=0,Options=new ObservableCollection<string>() {"--","option1","option2" } });
ViewModel.Add(new Test() { Total = 0, Options = new ObservableCollection<string>() {"--" ,"option1", "option2" } });
}
public ObservableCollection<Test> ViewModel { get; set; }
}
答案 1 :(得分:1)
您可以在Description
和Code
属性的设置方法中实现逻辑,而不是处理事件,例如:
private string _description;
public string Description
{
get { return _description; }
set
{
SetProperty(ref _description, value);
//your "selection changed" logic goes here...
}
}
正如@Xavier Xie所建议的,定义Description
,Code
,Price
,Quantity
等属性的类应实现INotifyPropertyChanged
界面并提出更改通知,以使视图自动刷新。有关更多信息,请参考MSDN。
由于您使用的是Prism,因此您可以继承Prism.Mvvm.BindableBase
并调用SetProperty<T>
方法来设置和引发属性更改通知。