首页 > 解决方案 > 绑定:如何绑定另一个类的属性

问题描述

我试图isfavorit从表中绑定属性bewertungen,这是类中的 ICollection filme_serien。我有一个filme_serien. 我正在尝试通过列表绑定isfavorit表格。bewertungenfilme_serien

急诊室:

在此处输入图像描述

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; }
}

贝维尔通根:

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包含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>

标签: c#wpfdata-bindingbinding

解决方案


我不太明白你的问题,所以这更像是一个建议。
但也许其中之一将解决您的问题。

  1. 您错误地实现了该FSList属性。每次访问该属性时,都会对 BD 进行一次新的查询,并返回一个新的集合。包括,此系列中的所有 FilmeSerien 副本也将是新的。但是根据 Presentation 的逻辑,你会认为它们是一样的。这样的实现很可能会导致某种错误。

  2. 最好_db在 using 块中一次性使用 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();
}
  1. 为了简化对 ViewModel 的访问,在资源中设置它的实例非常方便。你可以指定实例本身,也可以使用一些辅助容器类,在其属性中会有必要的数据,包括 ViewModel。

最简单情况下的实现示例:

<UserControl .....
    DataContext="{DynamicResource viewModel}">
    <UserControl.Resources>
        <anzeigen:FSViewModel x:Key="viewModel"/>
    <UserControl.Resources>
       <ToggleButton  Command="{Binding FavoritCommand,
                                  Source={StaticResource viewModel}}" .../>
  1. 为了方便在设计过程中检测错误,最好d: DesignInstance在 ViewModel 中定义设计模式,并在其中填充演示数据的实例,而不是 。

这种 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();
    }
}

希望其中一些对您有所帮助。


推荐阅读