WPF在网格上填充信息?

时间:2016-11-01 23:21:01

标签: c# wpf xaml mvvm

已编辑我删除了Name和Result集合,只是简单地绑定了AllResults属性。但是,我在那里看不到任何真正的价值,只有符合我应该看到的值数量的条目,但内容不存在。

我有以下XAML。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <TextBlock Margin="5" HorizontalAlignment="Center" Grid.Row="0">SomeTextHere</TextBlock>
        <ListView Grid.Row="1" ItemsSource="{Binding Path=AllResults}></ListView>          
    </Grid>

以下ViewModel

public class MyViewModel : INotifyPropertyChanged
        {
            #region Properties

            private ObservableCollection<Results> _AllResults;

            public ObservableCollection<Results> AllResults
            {
                get
                {
                    return _AllResults;
                }
                set
                {
                    _AllResults = value;
                    NotifyPropertyChanged("Results");
                }
            }

            #endregion

            #region PropertyChanged

            public event PropertyChangedEventHandler PropertyChanged;

            private void NotifyPropertyChanged(string info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }

            #endregion           
        }
    }

ViewModel由一个设置AllResults变量的实例调用:

MyViewModel myViewModel = PaneResultsControl.MyViewModelInstance; // Return the instance of the ViewModel.
myViewModel.AllResults = results;

我的逻辑失败了什么阻止我填充结果和名称列表?如果我传递其他值,如单个字符串并尝试绑定到TextBlock,它就像一个魅力,但我无法尝试填写GridView。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

通常,您需要设置ItemsSource的{​​{1}}属性,以便知道从何处获取数据:

ListView

但是,您已经完成了另外一个非常奇怪的步骤,即尝试将主要集合分解为两个单独的集合(<ListView Grid.Row="1" ItemsSource="{Binding AllResults}"> ... Name),然后您似乎尝试将模板绑定到那些。这才刚刚起作用。一旦进入数据模板,数据上下文就会切换到绑定对象,所以即使您有权访问ResultName(可能获得),它们仍然只是集合,而不是单个部分你想要的数据。

Result只能有一种来源,一种类型的对象。如果您需要转换数据以进行显示,请考虑直接绑定到ItemsControl类上的属性并使用转换器或计算属性,而不是打破您的集合

答案 1 :(得分:1)

更改通知内置于ObservableCollection中,因此您可以取消创建新集合和属性更改通知。

public ObservableCollection<string> Name { get; set; }
public ObservableCollection<string> Result { get; set; }

private List<Results> _AllResults;

public List<Results> AllResults
{
    get
    {
        return _AllResults;
    }
    set
    {
        _AllResults = value;

        Name.Clear();
        Result.Clear();

        foreach (Results results in _AllResults)
        {
            Name.Add(results.Name);
            Result.Add(results.Succeed ? "Pass" : "Fail");
        }
    }
}

此外,您的列表视图没有DataSource,您可能希望将ItemsSource设置为viewmodel上的ObservableCollection。这个集合可能应该由另一个类组成。

public ObservableCollection<Result> Results { get; set; }

public class Result 
{
  public string Name { get; set; }
  public string Result{ get; set; }
}


<ListView Grid.Row="1" ItemsSource={Binding Path=Results}>...