绑定:如何绑定另一个类的属性
Posted
技术标签:
【中文标题】绑定:如何绑定另一个类的属性【英文标题】:Binding: how can I bind a Property from another class 【发布时间】:2021-08-22 09:21:16 【问题描述】:我正在尝试从表bewertungen
中绑定属性isfavorit
,这是filme_serien
类中的一个ICollection。我有一个filme_serien
的列表。我正在尝试通过filme_serien
List 将isfavorit
绑定到bewertungen
表中。
ER:
C#:
电影连续剧:
public partial class FilmeSerien
public FilmeSerien()
Bewertungens = new HashSet<Bewertungen>();
public int FId get; set;
public bool Isfilm get; set;
public virtual ICollection<Bewertungen> Bewertungens get; set;
Bewertungen:
public partial class Bewertungen
public string BwAcc get; set;
public int BwFs get; set;
public bool Isfavorit get; set;
public int Bewertung get; set;
public virtual Account BwAccNavigation get; set;
public virtual FilmeSerien BwFsNavigation get; set;
FSList
和 SelectedFS
在 FSViewModel
中:
public IEnumerable<FilmeSerien> FSList
get => _db?.FilmeSeriens.Include(x => x.Bewertungens).AsNoTracking().ToList();
;
public FilmeSerien _selectedFS;
public FilmeSerien SelectedFS
get => _selectedFS;
set
_selectedFS = value;
NotifyPropertyChanged();
XAML:
d:DataContext="d:DesignInstance Type=anzeigen:FSViewModel"
FSViewModel
包含 FSList
和 FavoritCommand
,它们履行职责
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ItemsSource="Binding FSList"
SelectedItem="Binding SelectedFS">
<ListBox.ItemTemplate>
<DataTemplate>
<materialDesign:Card >
<Grid>
<ToggleButton Style="StaticResource MaterialDesignFlatPrimaryToggleButton"
IsChecked="False"
Command="Binding DataContext.FavoritCommand,
RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type UserControl"
CommandParameter="Binding" />
</Grid>
</materialDesign:Card>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
【问题讨论】:
一个 Bewertung 应该命名为单数 Bewertung,而不是 Bewertungen。该系列应该被称为Bewertungen,而不是Bewertungens,它不是德语。一般来说,使用英文标识符名称,因为它对国际观众来说更具可读性。 @Clemens 我对此无能为力,因为我已经通过EntityFrameworkCore
生成了模型类
重命名模型元素...
您要绑定到哪个特定的Bewertungen
? ToggleButton
中的 DataContext
是什么?
请发布更多您的 xaml,以便人们可以帮助您
【参考方案1】:
我不太明白你的问题,所以这更像是一个建议。 但也许其中之一可以解决您的问题。
您错误地实现了FSList
属性。每次访问该属性时,都会对 BD 进行一次新的查询,并返回一个新的集合。
包括,此系列中的所有 FilmeSerien 副本也将是新的。但是根据 Presentation 的逻辑,你会认为它们是一样的。这样的实现很可能会导致某种错误。
最好在 using 块中一次性使用 DB 上下文(变量_db
)。
我们提出了一个请求,从中获取数据,然后将其销毁。
否则,对于每一个请求,都需要考虑上一个请求的结果,用于实现请求的资源不会在请求之间释放。
实现示例:
public IEnumerable<FilmeSerien> FSList get;
// ViewModel constructor
public FSViewModel()
// I don't know the name of your DB context implementation type,
// so the name is conditional
using(var db = new AppDbContext())
FSList = db.FilmeSeriens
.Include(x => x.Bewertungens)
.AsNoTracking()
.ToList();
-
为了简化对 ViewModel 的访问,在资源中设置其实例非常方便。
您可以指定实例本身,也可以在其属性中使用一些辅助容器类,其中将包含必要的数据,包括 ViewModel。
最简单情况下的实现示例:
<UserControl .....
DataContext="DynamicResource viewModel">
<UserControl.Resources>
<anzeigen:FSViewModel x:Key="viewModel"/>
<UserControl.Resources>
<ToggleButton Command="Binding FavoritCommand,
Source=StaticResource viewModel" .../>
-
为了方便在设计过程中检测错误,最好在 ViewModel 中定义设计模式,并在其中填充演示数据,而不是
d: DesignInstance
。
这种 ViewModel 实现的示例:
private static bool IsInDesignMode get;
= DesignerProperties.GetIsInDesignMode(new DependencyObject());
public FSViewModel()
if (IsInDesignMode)
FSList = new List<FilmeSerien>()
// Several FilmeSerien instances are created here for the demo mode.
new FilmeSerien(...)....,
new FilmeSerien(...)....,
new FilmeSerien(...)....,
;
else
// Here is the code that runs when the Application is executed
using(var db = new AppDbContext())
FSList = db.FilmeSeriens
.Include(x => x.Bewertungens)
.AsNoTracking()
.ToList();
希望其中的一些对您有所帮助。
【讨论】:
以上是关于绑定:如何绑定另一个类的属性的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin 如何将类属性(来自另一个项目)绑定到 Picker.ItemDisplayBinding 属性