C# 通知viewmodel模型已更改(从组合框)
我有一个通过BaseModel类实现INotifyPropertyChanged的模型。 它内部有其他模型作为元素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
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");
}
}
}