【问题标题】:WPF binding from two sources来自两个来源的 WPF 绑定
【发布时间】:2015-08-06 21:59:06
【问题描述】:

我正在尝试在运行时确定大小的控件中显示一些专辑

XAML:

    <Grid>
    <Grid.Resources>
        <DataTemplate x:Key="AlbumsTemplate">
            <Grid>
                <Border Width="{Binding ThumbWidth}" Height="{Binding ThumbHeight}">
                    <Border.Background>
                        <ImageBrush ImageSource="{Binding Cover}"/>
                    </Border.Background>
                </Border>
                <StackPanel>
                    <TextBlock Text="{Binding Artist}" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </Grid.Resources>

    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>

    <ListBox ItemsSource="{Binding Albums}" ItemTemplate="{DynamicResource AlbumsTemplate}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>
</Grid>

后面的代码

 public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }

ViewModel.cs

    class ViewModel
{
    private ObservableCollection<Album> Albums { get; set; }
    public int ThumbWidth { get; set; }
    public int ThumbHeight { get; set; }

    public ViewModel()
    {
        ThumbWidth = 150;
        ThumbHeight = 150;
        Albums = DataSupplier.Instance.GetAlbums();
    }
}

专辑类

    class Album
{
    public string Name { get; set; }
    public string Artist { get; set; }
    public BitmapImage Cover { get; set; }

    public Album(string name, string artist, BitmapImage cover)
    {
        Name = name;
        Artist = artist;
        Cover = cover;
    }
}

我可以看到所有带有名称、艺术家和封面的专辑,但封面大小不正确。

在 DataTemplate 之外的控件中,我可以检索 ThumbWidth 和 ThumbHeight

我错过了什么?

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    问题是您当前的 DataContext 是 Album 而不是 ViewModel。你只能有一个 DataContext。

    1. 解决此问题的快速方法是将ThumbWidthThumbHeight 添加到您的Album 类中。

    2. 希望添加一个类AlbumViewModel,其中包含显示专辑所需的所有信息(如:witdh、高度、名称、标题、.. .)。此外,AlbumViewModels 的列表位于您的ViewModel。这样做是解决 MVVM 中问题的常用解决方案。

    3. 另一种 hacky 方法是,在您的 xaml 中访问父级的数据上下文属性:

      {Binding ThumbWidth, ElementName=LayoutRoot}

      更多关于这样做here

    【讨论】:

    • 我尝试成功地将大小参数添加到 Album 类,我只是认为我可以用更少的冗余数据完成任务......所以我成功地应用了你的第三个建议!我要试试你喜欢的方法谢谢大卫!
    【解决方案2】:

    无需为每个Album 添加高度/宽度,您可以使用ListBox(高度/宽度)当前所在的DataContext

    您可以使用FindAncestor 绑定来做到这一点

       <Border Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.ThumbWidth}" 
               Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.ThumbHeight}">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多