gpt4 book ai didi

c# - 绑定(bind)到 XAML 中的用户控件集合

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:52 25 4
gpt4 key购买 nike

我有一组要在堆栈面板中显示的用户控件。我无法控制这些用户控件包含的方式和内容。我只知道它们是某种用户控件(可以是按钮、文本 block 或任何 UIElement。)这是一个小例子

public class Car : IHasView
{
public UserControl MyView { get return new MyCarViewThatHasAButton(); }
}

public class Jeep : IHasView
{
public UserControl MyView { get return new MyJeepViewThatHasATextblock(); }
}

public class MainView : INotifyPropertyChanged{
private ICollection _myViews;
public ICollection MyViews {
get { return _myViews;}
set{
_myViews = value;
NotifyPropertyChanged("MyViews");
}

...
...
}

在此示例中,我想绑定(bind)到 MyViews 并在堆栈面板中显示集合中的所有 View 。我应该怎么去绑定(bind)它?我是 WPF 世界的新手。

谢谢。

最佳答案

这是一个实现方法的示例。

如果您只想要默认的 ItemsPanel 模板(垂直堆栈面板),则可以删除 ItemsControl 的 ItemsControl.ItemsPanel 部分 - 我只是多余地包含它,以便您可以看到 StackPanel 实际存在的位置,或者如果您想要以某种方式更改 StackPanel。

ItemTemplate 由 HasViewItemTemplate 的键名显式引用,因为您不能隐式应用数据模板,因为您的数据项是接口(interface)类型。

[您可能需要做更多工作,例如在 MyCarViewThatHasAButton 和 MyCarViewThatHasAButton 上使用单例,为 NotifyPropertyChanged 使用更好的模式等。]


<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication3="clr-namespace:WpfApplication3" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<WpfApplication3:MainView x:Key="MainView"/>
<DataTemplate x:Key="HasViewItemTemplate">
<ContentPresenter Content="{Binding Path=MyView}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<ItemsControl Background="Yellow" ItemTemplate="{StaticResource HasViewItemTemplate}" ItemsSource="{Binding Source={StaticResource MainView}, Path=MyViews}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Window>



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApplication3
{
public interface IHasView
{
UserControl MyView { get; }
}

public class Car : IHasView
{
public UserControl MyView
{
get
{
// Demo UserControl as prodcued by MyCarViewThatHasAButton

UserControl ctl = new UserControl();

ctl.Background = Brushes.Red;

Button button = new Button();

button.Content = "a car";

ctl.Content = button;

return ctl;
}
}
}

public class Jeep : IHasView
{
public UserControl MyView
{
get
{
// Demo UserControl as produced by MyJeepViewThatHasATextblock

UserControl ctl = new UserControl();

ctl.Background = Brushes.Blue;
ctl.Width = 50;

TextBlock textblock = new TextBlock();

textblock.Text = "a jeep";

ctl.Content = textblock;

return ctl;
}
}
}

public class MainView : INotifyPropertyChanged{

public MainView()
{
ObservableCollection<IHasView> list = new ObservableCollection<IHasView>()
{
new Car(),
new Jeep()
};

MyViews = list;
}

private ICollection _myViews;
public ICollection MyViews
{
get
{
return _myViews;
}
set
{
_myViews = value;
NotifyPropertyChanged("MyViews");
}
}

private void NotifyPropertyChanged(string p)
{
if (PropertyChanged != null)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(p);

PropertyChanged(this, e);
}
}

public event PropertyChangedEventHandler PropertyChanged;
}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}

关于c# - 绑定(bind)到 XAML 中的用户控件集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com