簡體   English   中英

綁定:如何綁定另一個 class 的屬性

[英]Binding: how can I bind a Property from another class

我正在嘗試從表bewertungen綁定屬性isfavorit ,這是 class filme_serien中的 ICollection 。 我有一個filme_serien的列表。 我正在嘗試通過filme_serien列表綁定isfavorit表中的bewertungen

急診室:

在此處輸入圖像描述

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

我不太明白你的問題,所以這更像是一個建議。
但也許其中之一將解決您的問題。

  1. 您錯誤地實現了FSList屬性。 每次訪問該屬性時,都會對 BD 進行一次新的查詢,並返回一個新的集合。 包括,此系列中的所有 FilmeSerien 副本也將是新的。 但是根據 Presentation 的邏輯,你會認為它們是一樣的。 這樣的實現很可能會導致某種錯誤。

  2. 最好在 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();
}
  1. 為了簡化對 ViewModel 的訪問,在資源中設置它的實例非常方便。 可以指定實例本身,也可以使用一些輔助容器class,其中的屬性中會有必要的數據,包括ViewModel。

最簡單情況下的實現示例:

<UserControl .....
    DataContext="{DynamicResource viewModel}">
    <UserControl.Resources>
        <anzeigen:FSViewModel x:Key="viewModel"/>
    <UserControl.Resources>
       <ToggleButton  Command="{Binding FavoritCommand,
                                  Source={StaticResource viewModel}}" .../>
  1. 為了方便在設計過程中發現錯誤,最好在 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();
    }
}

希望其中一些對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM