绑定:如何从另一个 class 绑定一个 属性
Binding: how can I bind a Property from another class
我正在尝试从 table bewertungen
绑定 属性 isfavorit
,它是 class filme_serien
中的一个 ICollection .我有一个 filme_serien
的列表。我正在尝试通过 filme_serien
List.
将 isfavorit
绑定到 bewertungen
table
错误:
C#:
filme_serien:
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>
我不太明白你的问题,所以这更像是一个建议。
但也许其中之一可以解决您的问题。
您错误地实施了 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的访问,在resources中设置它的实例非常方便。
您可以指定实例本身,您可以使用一些辅助容器 class 在其属性中将有必要的数据,包括 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();
}
}
希望其中的一些内容对您有所帮助。
我正在尝试从 table bewertungen
绑定 属性 isfavorit
,它是 class filme_serien
中的一个 ICollection .我有一个 filme_serien
的列表。我正在尝试通过 filme_serien
List.
isfavorit
绑定到 bewertungen
table
错误:
C#:
filme_serien:
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>
我不太明白你的问题,所以这更像是一个建议。
但也许其中之一可以解决您的问题。
您错误地实施了
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的访问,在resources中设置它的实例非常方便。 您可以指定实例本身,您可以使用一些辅助容器 class 在其属性中将有必要的数据,包括 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();
}
}
希望其中的一些内容对您有所帮助。