【问题标题】:Do not binding to View in MVVM?不要绑定到 MVVM 中的视图?
【发布时间】:2016-10-23 00:48:51
【问题描述】:

在 HomePage.xaml

 <Page.DataContext>
    <ViewModel:GetTweetVM/>
</Page.DataContext>

列表视图

<!--Content-->
    <ListView x:Name="lstHome"
                             Grid.Row="2"
                             Margin="5"
                             ItemInvoked="lstHome_ItemInvoked"
                             ContainerContentChanging="lstHome_ContainerContentChanging" ItemsSource="{Binding statusList}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"></ColumnDefinition>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                        <ColumnDefinition Width="auto"></ColumnDefinition>
                    </Grid.ColumnDefinitions>

                    <Image x:Name="imgThumbnailUser" Source="{Binding}"></Image>

                    <StackPanel Orientation="Vertical" Grid.Column="1">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Name="txtName" Text="{Binding Text}"></TextBlock>
                            <TextBlock x:Name="txtUsername" Text="{Binding User.Name}" Foreground="#CCCCCC"></TextBlock>
                        </StackPanel>
                        <TextBlock x:Name="txtContentMessage" Text="{Binding User.Categories.Name}" TextTrimming="CharacterEllipsis" Foreground="#CCCCCC"></TextBlock>
                    </StackPanel>

                    <TextBlock x:Name="txtDateTime" Text="{Binding}" Foreground="#CCCCCC"></TextBlock>

                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </control:ListView>

在 GetTweetVM 中

 public class GetTweetVM
{
    TwitterContext twitter;

    public List<Status> statusList { get; set; }
    public GetTweetVM()
    {
        statusList = new List<Status>();
        if (SharedState.Authorizer != null)
        {
            twitter = new TwitterContext(SharedState.Authorizer);
            GetTweet();
        }
        else
            return;

    }

    public async void GetTweet()
    {
        //base.GetTweet();
        var objectStatus = await (from status in twitter.Status
                            where status.Type == LinqToTwitter.StatusType.Home && status.Count==10
                            select status).ToListAsync();
        foreach(var item in objectStatus)
        {
            statusList.Add(item);
        }
        string t = statusList[0].Text;
    }
}

结果:

  1. string t 将从 statusList->"fadsvs.........." 中获取值
  2. 在未绑定到视图的 xaml 上。
  3. Listview 没有数据。

不知道哪里错了?请帮我解决它。

【问题讨论】:

  • 对于初学者,您的List&lt;Status&gt; 应该是ObservableCollection&lt;Status&gt;,否则对列表的修改不会更新ListView
  • 你能定制我的代码吗?为了更好的?。我靠它
  • 我不明白你的问题。鉴于您缺乏英语能力,您应该花更多时间了解具体细节。确保您包含一个良好的minimal reproducible example,该minimal reproducible example 可以可靠地重现问题,并确保您包含发生的任何错误消息、异常等的 exact 引号(最好也是英文...如果需要,将 UI 文化设置为“en”)。代码和机器生成的输出是通用的,并且在存在语言障碍时更容易理解。

标签: c# xaml uwp win-universal-app


【解决方案1】:

如果我理解正确,您有从 ViewModel 到 View 的通知问题

试试下面

public ObservableCollection<Status> statusList { get; set; }

ObservableCollection 将确保在添加任何项目时通知 UI。

更多关于 ObservableCollection

What is the use of ObservableCollection in .net?

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你当然应该替换:

    public List<Status> statusList { get; set; }  
    

    与:

    public ObservableCollection<Status> statusList { get; set; }
    

    当您使用 MVVM 和数据绑定时,您应该使用 ObservableCollection,这样您就可以在列表更改时收到 UI 通知。请注意,当列表中的某些对象属性仅更改列表本身(已在列表中添加/删除或移动元素)时,不会触发 UI 通知。这是因为 ObservableCollection 仅在集合发生变化时触发事件,而不是列表中的对象属性。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2011-10-07
      • 2013-09-26
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多