Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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
C# 通知viewmodel模型已更改(从组合框)_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 通知viewmodel模型已更改(从组合框)

C# 通知viewmodel模型已更改(从组合框),c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个通过BaseModel类实现INotifyPropertyChanged的模型。 它内部有其他模型作为元素 class SIDPoslJavnaUstanova : BaseModel { private int? _sid_posl_javna_ustanova_id; ... private decimal? _udaljenost; private SIDJavnaUstanova _sid_javna_ustanova; public S

我有一个通过BaseModel类实现INotifyPropertyChanged的模型。 它内部有其他模型作为元素

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>
   {
   }
}
我不能这样做,因为元素是可观察的集合。 可能这是一个糟糕的模型,请建议一些东西或帮助当前代码。

您需要a)指定
SelectedItem
b)将
SelectedItem
绑定到与集合中的元素相同类型的属性(即在您的情况下为
sidposljavanustanova
)。 我想这应该行得通:

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

        }
    }
}

.........................................
//主视图模型
公共Sidposljavanustanova SelectedModel
{
获取{return\u selectedModel;}
设置
{
如果(_selectedModel!=值)
{ 
_selectedModel=值;
RaisePropertyChanged(“SelectedModel”);
}
}
}

是的,这是一个糟糕的设计。

为什么model和ViewModel有两个不同的基类?既然两者都可以通知更改,为什么不让它们派生自同一个类呢?请不要这样做,而是通过`使用代码突出显示。它们基本相同,BaseModel有一些我以后需要的属性,但在base中,它们是注释中的samePost图像url,我会将其添加到问题中。如果您对设计有一些建议,请告诉我,因为这是我的第一个MVVM。但是SelectedItem不能是SidPoslJavnaUstanova的类型,因为它是SidJavnaUstanova的类型。@DukeNukem遗憾的是,我不能在不知道您要做什么的情况下建议您采取行动。但从表面上看,你的逻辑层次结构被打破了。例如,如果您的数据网格表示不同的存储,您可能应该将
sidposljavnaustanoviewmodel
(和类似属性)封装到
Store
对象中,而不是将其保存在主视图模型中。Store模型具有一些基本数据,如地址、城市、,名称,但Sidposljavanustanova是不同的表,一个存储有许多记录。我有很多这样的表,有一对多的关系,我不希望他们都在商店模型,或者我想?它似乎是工作!我没有在同一时刻得到它。谢谢:)当然,它是SIDJavnaUstanova而不是SIDPoslJavnaUstanova,但我通过
set{{u SidPoslJavNaustanoviewModel.SelectedElement.SIDJavnaUstanova=value;}
<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.Elements.??? SIDJavnaUstanova 
<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");

        }
    }
}