2013-06-21 55 views
2

我有一個模型,通過BaseModel類實現INotifyPropertyChanged。 它內部有其他模型作爲元素。通知viewmodel模型已經改變(從combobox)

class SIDPoslJavnaUstanova : BaseModel 
{ 
    private int? _sid_posl_javna_ustanova_id; 
    ... 
    private decimal? _udaljenost; 
    private SIDJavnaUstanova _sid_javna_ustanova; 

    public SIDJavnaUstanova SidJavnaUstanova 
    { 
     get { return _sid_javna_ustanova; } 
     set { 
      if (_sid_javna_ustanova != value) 
      { 
       _sid_javna_ustanova = value; 
       if (_sid_javna_ustanova != null) 
       { 
        _sid_javna_ustanova_id = _sid_javna_ustanova.SidJavnaUstanovaId; 
       } 
       else 
       { 
        _sid_javna_ustanova_id = null; 
       } 
       RaisePropertyChanged("SidJavnaUstanova"); 
      } 
     } 
    } 

我有viewmodel具有可觀察的這個模型對象的集合。

class BaseViewModel<T> : ObservableObject 
{ 
    private ObservableCollection<T> _elements = new ObservableCollection<T>(); 
    public ObservableCollection<T> Elements 
    ... 

    class SIDPoslJavnaUstanovaViewModel : BaseViewModel<SIDPoslJavnaUstanova> 
    { 
    } 
} 

最後,被綁定到視圖mainviewmodel:

class MainViewModel : BaseViewModel<Store> 
{ 
    private SIDJavnaUstanovaViewModel _sidJavnaUstanovaViewModel; 
    private SIDJavnaUstanova _sidJavnaUstanova; 

    public SIDPoslJavnaUstanovaViewModel SidPoslJavnaUstanovaViewModel 
    { 
     get { return _sidPoslJavnaUstanovaViewModel; } 
     set 
     { 
      if (_sidPoslJavnaUstanovaViewModel != value) 
      { 
       _sidPoslJavnaUstanovaViewModel = value; 
       RaisePropertyChanged("SidPoslJavnaUstanovaViewModel"); 
      } 
     } 
    } 

    public SIDJavnaUstanovaViewModel SidJavnaUstanovaViewModel 
    { 
     get { return _sidJavnaUstanovaViewModel; } 
     set 
     { 
      if (_sidJavnaUstanovaViewModel != value) 
      { 
       _sidJavnaUstanovaViewModel = value; 
       RaisePropertyChanged("SidJavnaUstanovaViewModel"); 

      } 
     } 
    } 

SidJavnaUstanova僅用於填充組合框,並結合choosen時到對象。

我在datagrid中有combobox,它有多行。元素是SIDJAVNAUSTANOVA,下拉列表是SIDJAVNAUSTANOVAVIEWMODEL。 下拉是SIDJAVNAUSTANOVAVIEWMODEL.ELEMENTS (不能顯示你的照片不夠口碑)

<src:BaseWindow.Resources> 
    <viewmod:MainViewModel x:Key="StoreViewM"/> 
</src:BaseWindow.Resources> 
<DataGrid.Columns> 
<DataGridTemplateColumn Width="140" Header="{StaticResource name}"> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
<ComboBox ItemsSource="{Binding Path=SidJavnaUstanovaViewModel.Elements, 
Source={StaticResource StoreViewM}}" 
SelectedItem="{Binding Path=SidJavnaUstanova,UpdateSourceTrigger=PropertyChanged, 
Mode=TwoWay}" 
DisplayMemberPath="Naziv" 
SelectedValue="{Binding Path=SidJavnaUstanova, Mode=TwoWay}"> 
</ComboBox> 
... 

一切工作時,組合框被改變,除了罰款,對象SIDPoslJavnaUstanova的元素SIDJavnaUstanova改變,我可以在其模型屬性抓住這個。但我必須具備的是在視圖模型中捕捉這個SidJavnaUstanova的變化,所以如果sidposljavnaustanovaviewmodel.elements中有sidjavnaustanova的重複項,我可以實施退房。我不知道該怎麼做。 喜歡的東西

SIDPoslJavnaUstanova.Elements.??? SIDJavnaUstanova 

我不能這樣做,因爲元素是可觀察的集合。 也許這是一個不好的模型,請建議一些東西或幫助當前的代碼。

+0

爲什麼模型和ViewModel有兩個不同的基類?既然兩者都能夠通知變化,爲什麼你不讓他們派生出同一班呢?請不要做這個CapsLock的事情,而是使用代碼突出顯示。 – DHN

+0

他們幾乎相同,BaseModel有一些我稍後需要的屬性,但在基地他們是相同的 – DukeNukem

+0

在評論中張貼圖像網址,我會將它添加到問題。 – abatishchev

回答

0

您需要a)指定SelectedItem的來源b)將SelectedItem綁定爲與您的集合中的元素(即您的案例中的SIDPoslJavnaUstanova)相同類型的屬性。 這應該工作,我猜:

<ComboBox ItemsSource="{Binding Path=SidJavnaUstanovaViewModel.Elements, 
    Source={StaticResource StoreViewM}}" 
    SelectedItem="{Binding Path=SelectedModel,UpdateSourceTrigger=PropertyChanged, 
    Mode=TwoWay, Source={StaticResource StoreViewM}}" 
    DisplayMemberPath="Naziv"> 
</ComboBox> 

......................................... 

//MainViewModel 

public SIDPoslJavnaUstanova SelectedModel 
{ 
    get { return _selectedModel; } 
    set 
    { 
     if (_selectedModel != value) 
     { 
      _selectedModel = value; 
      RaisePropertyChanged("SelectedModel"); 

     } 
    } 
} 

是的,這是一些可怕的設計。

+0

如果您對設計有一些建議,請告訴我,因爲這是我的第一個MVVM。但是SelectedItem不能是SidPoslJavnaUstanova的類型,因爲它是一種SidJavnaUstanova類型。 – DukeNukem

+0

@DukeNukem不幸的是,我不能建議你採取行動,而不知道你在做什麼。但從它的外觀來看,你的邏輯層次被打破了。如果您的數據網格代表不同的商店,那麼您可能會將您的'SIDPoslJavnaUstanovaViewModel'(以及類似的屬性)封裝到'Store'對象中,而不是將其保存在主視圖模型中。 –

+0

商店模型具有一些基本數據,城市,名稱但SidPoslJavnaUstanova是一個商店的許多記錄不同的表。我有許多那些有一對多關係的表,我不希望他們都在Store模型中,或者我想要嗎? – DukeNukem