gpt4 book ai didi

c# - 通知 View 模型模型已更改(来自组合框)

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:37 25 4
gpt4 key购买 nike

我有一个通过 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");
}
}
}

我的 View 模型包含此模型对象的可观察集合。

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

class SIDPoslJavnaUstanovaViewModel : BaseViewModel<SIDPoslJavnaUstanova>
{
}
}

最后,绑定(bind)到 View 的主视图模型:

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 仅用于填充组合框,并在选择时绑定(bind)到对象。

我在数据网格中有组合框,它有多行。元素是 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 发生变化,我可以在其模型属性中捕捉到这一点。但我必须具备的是在 viewmodel 中捕获此 SidJavnaUstanova 的变化,因此如果 sidposljavnaustanovaviewmodel.elements 中有重复的 sidjavnaustanova,我可以执行 check out 。我不知道该怎么做。有点像

SIDPoslJavnaUstanova.Elements.??? SIDJavnaUstanova 

我不能这样做,因为元素是可观察的集合。也许这是一个不好的模型,请提出一些建议或帮助当前代码。

最佳答案

您需要 a) 为 SelectedItem 指定源 b) 将 SelectedItem 绑定(bind)到相同类型的属性,作为您集合中的元素(即 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");

}
}
}

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

关于c# - 通知 View 模型模型已更改(来自组合框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17228910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com