我有一个通过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>
{
}
}
最后,绑定查看的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被更改,我可以在其模型属性中捕获它。但我必须拥有的是在视图模型中捕获此SidJavnaUstanova的更改,因此如果在sidposljavnaustanovaviewmodel.elements中存在重复的sidjavnaustanova,我可以实施签出。我无法实现如何做到这一点。 像
这样的东西SIDPoslJavnaUstanova.Elements.??? SIDJavnaUstanova
我不能这样做,因为元素是可观察的集合。 也许这是一个糟糕的模型,请提出建议或帮助解决当前的代码。
答案 0 :(得分: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");
}
}
}
是的,这是一个糟糕的设计。