1

我一直在学习本教程以尝试理解 XML、WPF 和 C#(来自 Fortran)。我已经使功能正常工作(感谢教程),但是我在修改它以使用 WPF 而不是 WinForms 时遇到了麻烦。

本质上,当我单击“获取 RSS”按钮时,会发生以下情况:

RssManager reader = new RSSManager();
ObservableCollection<Rss.Items> _list = new ObservableCollection<Rss.Items>();
reader.Url = txtFeed.Text;
reader.GetFeed();
_list = (ObservableCollection<Rss.Items>)reader.RssItems;

列表视图只是空白。它的代码如下。此外,使用列表框尝试此操作会导致为列表中的每个项目而不是我的数据填充类的名称:

<ListView ItemsSource="_rssItems">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
        </GridView>
    </ListView.View>
</ListView>

是否有可能做类似的事情(再次原谅我的无知,在这里):

_list.Add( new Rss.Items());

列表 (_list) 包含我需要的所有信息,我只是想弄清楚如何将它正确绑定(或添加)到 ListView。

4

2 回答 2

1

看起来你有点迷路了。

最终,您希望将视图(WPF 表单)绑定到视图模型,并将视图模型绑定到模型(RSSManager)。

现在让我们将视图直接绑定到模型。

在您的构造函数中,您创建模型的新实例并将其分配给数据上下文。

这个模型会随着形式存在——

    public MainWindow()
    {
        InitializeComponent();
        _model = new RssManager();
        DataContext = _model;

    }

然后在您的 XAML 中将项目源绑定到您的集合属性:

       <ListView ItemsSource="{Binding Path=RssItems}">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
                </GridView>
            </ListView.View>
        </ListView>

请注意,“Path=RssItems”中的内容与您分配给 DataContext 的内容相关。

然后在您的刷新按钮逻辑中调用:

_model.Url = txtFeed.Text;
_model.GetFeed();

您最终想要做的是在中间放置另一层。这是视图模型。View 模型是您可能已经猜到的视图模型。

视图模型的工作是收集有关视图状态的信息,并从模型中公开要由视图呈现的数据。它还可以保存当前的 ui 状态信息 - fe 选择表中的哪一行,因为稍后可能会有一些命令对其进行操作。本质上,它允许从代码中抽象出视图的所有逻辑。您的命令对诸如选择哪一行之类的操作进行操作 - 无论选择哪种类型的控件。

于 2012-07-22T00:28:18.550 回答
0

正如 Lee 在他的评论中所建议的那样,ListView 的 ItemsSource 属性的绑定似乎不正确。有多种方法可以解决此问题,具体取决于您的项目的设计/结构方式。

为了 Da​​taBind,ListView 需要某种 DataContext(顾名思义)是一种用于 Binding 的 Context。如果您使用的是 MVVM,那么整个 Window/Control 的 DataContext 很可能是一个 ViewModel。在这种情况下,您可以像这样绑定到 ViewModel 的属性:

<ListView ItemsSource="{Binding RssItems}">...</ListView>

这假设您有一个具有公共 RssItems 属性(某种 List/Enumerable)的 ViewModel,并且 ViewModel 是 DataContext。

如果您不使用 MVVM,有很多方法可以使用和不使用 DataBinding 来分配 ItemsSource。如果您对 DataBinding 不完全满意,我建议的最简单方法是手动分配 ItemsSource,如下所示:

xml:

<ListView x:Name="MyRssList">...</ListView>

后面的代码(在 UI 加载之后以及创建/填充 _list 之后的某个地方):

MyRssList.ItemsSource = _list;

这不使用 DataBinding,但它会完成工作。如果您想从 DataBinding 开始,您可以执行以下操作:

XAML:

<ListView x:Name="MyRssList" ItemsSource="{Binding}>...</ListView>

代码背后:

MyRssList.DataContext = _list;

这会将 List 分配为 ListView 的 DataContext,然后将 ItemsSource 属性 DataBind 到 DataContext。

总的来说,你走在正确的轨道上。我建议阅读一些有关DataBindingMVVM的内容。MVVM 是利用 WPF 强大的 DataBinding 功能的一种非常好的方法,对 DataBinding 的深入了解对于设计和构建出色的 WPF 应用程序非常有价值。

希望这可以帮助。祝你好运!

于 2012-07-22T00:35:30.720 回答