Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为wpf datagrid的SelectedRow值更新GUI_Wpf_Xaml_Mvvm_Mvvm Light_Inotifypropertychanged - Fatal编程技术网

为wpf datagrid的SelectedRow值更新GUI

为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"

我有一个wpf(.Net 4.5)数据网格。我将MVVM模式用于我的MVVM轻型框架应用程序

我有一个datagrid,它绑定到一个称为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>
但这些都不起作用

第二:

我还尝试在绑定到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更新调用都不符合原则(因为更改其他组合框的原因是业务逻辑,而不是数据关系),但是将其添加到我的模型中是一个很快的解决方案,我将继续。