C# 绑定:如何从另一个类绑定属性

C# 绑定:如何从另一个类绑定属性,c#,wpf,data-binding,binding,C#,Wpf,Data Binding,Binding,我正在尝试绑定表bewertungen中的属性isfavorit,这是类filme\u serien中的一个ICollection。我有一张电影系列的清单。我正试图通过filme\u serien列表将isfavorit绑定到bewertungen表中 ER: d:DataContext="{d:DesignInstance Type=anzeigen:FSViewModel}" public IEnumerable<FilmeSerien> FSList {g

我正在尝试绑定表
bewertungen
中的属性
isfavorit
,这是类
filme\u serien
中的一个ICollection。我有一张电影系列的清单。我正试图通过
filme\u serien
列表将
isfavorit
绑定到
bewertungen
表中

ER:

d:DataContext="{d:DesignInstance Type=anzeigen:FSViewModel}"
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();
}
<UserControl .....
    DataContext="{DynamicResource viewModel}">
    <UserControl.Resources>
        <anzeigen:FSViewModel x:Key="viewModel"/>
    <UserControl.Resources>
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();
    }
}

C#:

d:DataContext="{d:DesignInstance Type=anzeigen:FSViewModel}"
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();
}
<UserControl .....
    DataContext="{DynamicResource viewModel}">
    <UserControl.Resources>
        <anzeigen:FSViewModel x:Key="viewModel"/>
    <UserControl.Resources>
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();
    }
}
电影系列:

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

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

  • 您错误地实现了
    FSList
    属性。每次访问此属性时,都会向BD进行新的查询,并返回新的集合。 包括,本系列中的所有Filmereserien副本也将是新的。但是根据演示文稿的逻辑,你会认为它们是一样的。这样的实现可能会导致一些bug

  • 最好在using块中一次性使用DB上下文(变量
    \u DB
    )。 我们提出请求,从中获取数据,然后销毁它。 否则,对于每个请求,您需要考虑上一个请求的结果,用于实现请求的资源将不会在请求之间释放

  • 实现示例:

    d:DataContext="{d:DesignInstance Type=anzeigen:FSViewModel}"
    
    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();
    }
    
    <UserControl .....
        DataContext="{DynamicResource viewModel}">
        <UserControl.Resources>
            <anzeigen:FSViewModel x:Key="viewModel"/>
        <UserControl.Resources>
    
    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();
        }
    }
    

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

    一个Bewertung应该命名为singular Bewertung,而不是Bewertungen。该集合应称为Bewertungen,而不是Bewertungens,后者不是德语。一般来说,使用英文标识符名称,因为它对于国际观众来说更具可读性。@Clemens我对此无能为力,因为我已经通过
    EntityFrameworkCore
    重命名模型元素生成了模型类……您要绑定到哪个特定的
    Bewertungen
    ToggleButton
    DataContext
    是什么?请发布更多您的xaml,以便人们可以帮助您