更新wpf datagrid的SelectedeRow值的GUI

时间:2013-06-14 04:45:39

标签: wpf xaml mvvm mvvm-light inotifypropertychanged

我有一个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的实现?

1 个答案:

答案 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;
        }
    }
}