我有一个wpf(.Net 4.5)数据网格。我在MVVM-Light框架中使用MVVM模式。
我有一个数据网格绑定到名为TrackingCollection的可观察的“跟踪”对象集合。 datagrid selectedItem绑定到viewModel中的“SelectedTracking”属性。
<DataGrid Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" MinHeight="300"
ItemsSource="{Binding TrackingCollection}"
CanUserAddRows="False" CanUserDeleteRows="False"
SelectionMode="Single" SelectedItem="{Binding SelectedTracking, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
RowDetailsTemplate="{StaticResource FTC_TrackingFullDetailTemplate}">
</DataGrid>
我在一列中有一个comboBox,它绑定到SelectedTracking对象的“idAction”属性。当用户更改此comboBox的选择时,我想在datagrid的另外两列中分配另外两个组合框的值。这些其他列未绑定到视图模型的属性,而是直接绑定到SelectedTracking对象的属性。 SelectedTracking对象的这些属性是iSource_Type和iDestination_Type。
这是iSourceType的列定义:
<DataGridTemplateColumn Header="SOURCE" SortMemberPath="tracking_source.chrSource" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Style="{StaticResource FTC_DetailComboBox}" Margin="0" Padding="3"
ItemsSource="{Binding DataContext.TrackingSources, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
SelectedValuePath="idSource"
DisplayMemberPath="chrSource"
SelectedValue="{Binding iSource_Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
因此,当我在ViewModel代码(第一个“Action”组合框的selectionChanged函数中的)中分配这些(iSource_Type,iDestination_Type)值时,会在对象本身上更新这些值。但是这种变化并没有反映到UI与这些属性绑定的组合框架中。
我尝试了什么:
首先:
我有一个名为RaisePropertyChanged的函数的INotifyPropertyCHanged实现。这是通过MVVM_Light框架提供的。所以我尝试使用以下内容:
RaisePropertyChanged("iDestination_Type")
RaisePropertyChanged("iSource_Type")
RaisePropertyChanged("SelectedTracking")
RaisePropertyChanged("SelectedTracking.iDestination_Type")
RaisePropertyChanged("SelectedTracking.iSource_Type")
但这些都行不通。
第二
我还尝试在viewmodel中创建绑定到SelectedTracking对象的属性。但这只会导致所有跟踪对象获得相同的值。
问题: INotifyPropertyChanged可以处理不属于viewmodel的属性,但是是视图模型中找到的对象的属性。如果是这样,我在INotifyPropertyChanged事件中需要什么语法?
其他信息: INotifyPropertyChanged(RaisePropertyChanged())的MVVM-Light实现不接受将正常更新所有UI元素的空字符串。那么有没有办法可以在一个CLass中覆盖INotifyPropertyCHanged的实现?
答案 0 :(得分:2)
如果我正确理解您的问题,您可以通过一种方式通知ViewModel您的模型发生的更改。
如果是这样,您可以在模型中实现INotifyPropertyChanged,并在ViewModel中订阅模型对象PropertyChanged事件。在这里,您可以在ViewModel属性上引发属性更改通知。
一个简单的例子来证明这个概念:
<强>型号:强>
public class Tracking : INotifyPropertyChanged
{
private string _isourcetype;
private string _idestinationtype;
public string SourceType
{
get { return _isourcetype; }
set
{
_isourcetype = value;
OnPropertyChanged("SourceType");
}
}
public string DestinationType
{
get { return _idestinationtype; }
set
{
_idestinationtype = value;
OnPropertyChanged("DestinationType");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
<强>视图模型:强>
public class TrackingViewModel : ViewModelBase
{
private Tracking _selectedTracking;
public string DestinationType
{
get { return _selectedTracking.DestinationType; }
}
public string SourceType
{
get { return _selectedTracking.SourceType; }
}
public Tracking SelectedTracking
{
get { return _selectedTracking; }
set
{
_selectedTracking = value;
RaisePropertyChanged("SelectedTracking");
}
}
public TrackingViewModel()
{
_selectedTracking = new Tracking();
_selectedTracking.PropertyChanged += SelectedTracking_PropertyChanged;
}
void SelectedTracking_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "SourceType":
RaisePropertyChanged("SourceType");
break;
case "DestinationType":
RaisePropertyChanged("DestinationType");
break;
}
}
}