【问题标题】:How do binding with listview如何与listview绑定
【发布时间】:2016-12-28 05:58:41
【问题描述】:

如何绑定listview?我上课了,我收集了我,但是当我绑定时它不起作用:

        public class DrawingVisualObject : DrawingVisual
       {
        public int Id { get; set; }
        public string Name { get; set; }
        public DrawingVisualObject(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }

    ObservableCollection<DrawingVisualObject> mPointNames = new     ObservableCollection<DrawingVisualObject>();
    public MainWindow()
    {
        this.DataContext = mPointNames;
        InitializeComponent();
        lstv.ItemsSource = mPointNames;
    }

    public ObservableCollection<DrawingVisualObject> PointNames
    {
        get
        {
            return mPointNames;
        }
    }

这是我写的 xaml 代码

<ListView MinHeight="350" ItemsSource="{Binding DrawingVisualObject, Mode=TwoWay}" Name="lstv">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Id}"/>

【问题讨论】:

  • 你有标准的 MVVM 架构吗?
  • 是的,我有 MVVM 架构

标签: c# wpf listview binding


【解决方案1】:

您的示例看起来不像 MVVM,但是如果您想在代码中包含数据,请使用依赖属性。

这是 XAML 的示例

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    Name="myWindow">
<Grid>
          <ListView ItemsSource="{Binding ElementName=myWindow, Path=DrawingVisualCollection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"></GridViewColumn>
                <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Path=Id}"></GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

</Grid>

后面的代码是这样的

namespace Test
{

public class DrawingVisualObject : DrawingVisual
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DrawingVisualObject(int id, string name)
    {
        Id = id;
        Name = name;
    }
}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public ObservableCollection<DrawingVisualObject> DrawingVisualCollection
    {
        get { return (ObservableCollection<DrawingVisualObject>)GetValue(DrawingVisualCollectionProperty); }
        set { SetValue(DrawingVisualCollectionProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DrawingVisualCollection.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DrawingVisualCollectionProperty =
        DependencyProperty.Register("DrawingVisualCollection", typeof(ObservableCollection<DrawingVisualObject>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<DrawingVisualObject>()));

    public MainWindow()
    {
        InitializeComponent();

        List<DrawingVisualObject> sample = new List<DrawingVisualObject>();

        sample.Add(new DrawingVisualObject(1, "Yolo"));
        sample.Add(new DrawingVisualObject(2, "Swag"));

        this.FillCollection(sample);

    }

    public void FillCollection(IEnumerable<DrawingVisualObject> objects2fill)
    {
        this.DrawingVisualCollection.Clear();

        foreach(DrawingVisualObject obj in objects2fill)
        {
            this.DrawingVisualCollection.Add(obj);
        }
    }


}

}

这应该适合你

请记住: 如果你再次初始化集合,你可能会破坏绑定。我试图在示例方法 FillCollection() 中展示这一点。所以这意味着如果您使用 MVVM,您应该始终将 ObservableCollection 设置为私有集。

我建议您更准确地再次访问 MVVM。要知道视图模型的共同基础是什么,总是好的start!!!

【讨论】:

    【解决方案2】:

    您不必使用 DrawingVisual 进行绑定。在您的 ViewModel 或您的模型中创建类 FooItem

    public class FooItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public FooItem(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }
    

    然后在你的 ViewModel 中创建 ObservableCollection

     public ObservableCollection<FooItem> PointNames
        {
            get
            {
                return mPointNames;
            }
        }
    

    在您的 xaml 中使用:

    <ListView Margin="10" Name="FooItems" ItemsSource="{Binding Path=PointNames}">
            <ListView.View>
                    <GridView>
                            <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                            <GridViewColumn Header="Id" Width="50" DisplayMemberBinding="{Binding Id}" />
                    </GridView>
            </ListView.View>
    </ListView>
    

    比删除“lstv.ItemsSource = mPointNames;”从视图构造函数。在 MVVM 中应该只有 init 调用,最大程度地初始化事件处理程序。

    希望对你有帮助

    【讨论】:

    • 将 DataContext 设置为拥有 PointNames 属性的类的实例,即视图模型类。如果 MainWindow 有该属性,则设置 DataContext = this。
    • 如果它不起作用,则可能是View和DataContext之间存在问题。克莱门茨是对的。但是当你使用 DataContext = this 时要小心。有充分的理由反对 MVVM。如果绑定有问题,可以在绑定中使用转换器进行调试。喜欢spin.atomicobject.com/2013/12/11/wpf-data-binding-debug
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 2011-08-27
    • 2013-10-16
    • 1970-01-01
    • 2018-08-05
    • 2015-05-15
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多