绑定:如何绑定另一个类的属性

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_serienList 将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; 

FSListSelectedFSFSViewModel 中:

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 包含 FSListFavoritCommand,它们履行职责

<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 生成了模型类 重命名模型元素... 您要绑定到哪个特定的BewertungenToggleButton 中的 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 属性

WPF元素绑定

如何将动态创建的 qmlcomponent 对象绑定到另一个动态创建的 qmlcomponent 对象的属性?

绑定:未找到属性。 MVVM

如何将JProgressbar绑定到Bean类的属性