为wpf datagrid的SelectedRow值更新GUI
我有一个wpf(.Net 4.5)数据网格。我将MVVM模式用于我的MVVM轻型框架应用程序 我有一个datagrid,它绑定到一个称为TrackingCollection的可观察的“跟踪”对象集合。datagrid selectedItem绑定到viewModel中的“SelectedTracking”属性为wpf datagrid的SelectedRow值更新GUI,wpf,xaml,mvvm,mvvm-light,inotifypropertychanged,Wpf,Xaml,Mvvm,Mvvm Light,Inotifypropertychanged,我有一个wpf(.Net 4.5)数据网格。我将MVVM模式用于我的MVVM轻型框架应用程序 我有一个datagrid,它绑定到一个称为TrackingCollection的可观察的“跟踪”对象集合。datagrid selectedItem绑定到viewModel中的“SelectedTracking”属性 <DataGrid Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" MinHeight="300"
<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>
但这些都不起作用
第二:
我还尝试在绑定到SelectedTracking对象的viewmodel中创建属性。但这只会导致所有跟踪对象获得相同的值
问题:
INotifyPropertyChanged可以处理不属于viewmodel的特性,但属于在视图模型中找到的对象的特性。如果是,在INotifyPropertyChanged事件中需要什么语法
其他信息:
INotifyPropertyChanged(RaisePropertyChanged())的MVVM Light实现不接受通常会更新所有UI元素的空字符串。那么,有没有一种方法可以在一个类中重写INotifyPropertyCHanged的实现?如果我正确理解了您的问题,您希望有一种方法通知您的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;
}
}
}
视图模型:
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;
}
}
}
谢谢,我的模型已经实现了iNotifyPropertyChanged,我想让ViewModel中的所有UI更新调用都不符合原则(因为更改其他组合框的原因是业务逻辑,而不是数据关系),但是将其添加到我的模型中是一个很快的解决方案,我将继续。