2

BaseModel クラスを介して INotifyPropertyChanged を実装するモデルが 1 つあります。その中に要素として他のモデルがあります。

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");
            }
        }
    }

このモデル オブジェクトの観測可能なコレクションを持つビューモデルがあります。

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 は、コンボボックスに入力するため、および選択時にオブジェクトにバインドするためにのみ使用されます。

複数の行を持つデータグリッドにコンボボックスがあります。要素は 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 が変更された場合を除いて、すべて正常に機能しており、モデル プロパティでこれをキャッチできます。しかし、sidposljavnaustanovaviewmodel.elements に sidjavnaustanova の重複がある場合にチェックアウトを実装できるように、viewmodel でこの SidJavnaUstanova の変更をキャッチする必要があります。私はそれを行う方法を理解できません。何かのようなもの

SIDPoslJavnaUstanova.Elements.??? SIDJavnaUstanova 

要素は監視可能なコレクションであるため、これを行うことはできません。多分それは悪いモデルです、何かを提案するか、現在のコードを手伝ってください。

4

1 に答える 1

0

a)のソースを指定する必要がありますb)コレクション内の要素と同じタイプのプロパティにSelectedItemバインドします (つまり、あなたの場合)。これはうまくいくはずです、私は推測します:SelectedItemSIDPoslJavnaUstanova

<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");

        }
    }
}

そして、はい、これはひどいデザインです。

于 2013-06-21T06:48:51.467 に答える