绑定 Listview 的 GridView 的 DataGridCell 的 TextBlock

Binding the TextBlock of a Listview's GridView's DataGridCell

我有一个 ObservableCollection 的模型对象,我试图在 ListViewGridViewDataGridCells 中显示。对于这个简化的示例,假设我的模型对象都有 "MyString," 并且我试图在每行的 DataGridCell.[= 内的 TextBlock 中显示 "MyString" 24=]

随着 ObservableCollection 添加或删除这些模型对象,ListView 显示正确的行数,但各个单元格为空。我如何正确绑定它们?我应该使用 DataContext 还是 ItemSource,如果是,在哪里?这是一种此类绑定尝试的单列示例。

<ListView ItemsSource="{Binding MyObservableCollection}">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumnHeader Content="My String Data" />
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <DataGridCell>
                            <TextBlock Text="{Binding Path=MyString}">
                            </TextBlock>
                        </DataGridCell>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

编辑:Per Michal Ciechan,我已经在我的模型 class 上实施了 INotifyPropertyChanged,但它似乎没有任何改变。但是,一旦这些对象进入集合,我实际上不会更改它们的字段,因此这可能不是正确的方法。这是更多示例代码。

模特:

public class MyModel : INotifyPropertyChanged
{
    public string MyString;
    public event PropertyChangedEventHandler PropertyChanged;
}

视图模型:

ObservableCollection<MyModel> MyObservableCollection = new ObservableCollection<MyModel>();

public void AddModelToCollection()
{
    MyModel mm = new MyModel();
    mm.MyString = "HELLO WORLD";
    MyObservableCollection.Add(mm);
}

public string MyString; 是一个字段,而不是 属性。您不能绑定到字段。您只能绑定到属性。

private string _myString;
public string MyString
{
    get
    {
        return _myString;
    }
    set
    {
        _myString = value;
        OnPropertyChanged("MyString");
    }
}

我会把 OnPropertyChanged 的实现留给你。

澄清

这是一个PROPERTY:

public string DERP { get; set; } 

注意它有一个 getter 和一个 setter。编译器把它变成了两种方法,一种是获取值,一种是设置值。

这是一个FIELD:

public string HERP;

注意,它没有 getter 或 setter。它只是一个指向堆栈上的值的指针。

重要的一点来了:

在 WPF 中,绑定不适用于 FIELDS。它们只适用于 PROPERTIES

因此,在尝试绑定字段之前设置字段值并不重要。绑定不会查找字段,因此不会看到它。

Will 是对的,您的模型 class 需要 MyString 作为 属性 而不是字段。

What is the difference between a Field and a Property in C#?

WPF - Binding - Binding Source

You can bind to public properties, sub-properties, as well as indexers, of any common language runtime (CLR) object. The binding engine uses CLR reflection to get the values of the properties. Alternatively, objects that implement ICustomTypeDescriptor or have a registered TypeDescriptionProvider also work with the binding engine. For more information about how to implement a class that can serve as a binding source, see Implementing a Class for the Binding Source later in this topic.

public class MyModel : INotifyPropertyChanged
{
    private string _myString;
    public string MyString
    {
        get
        {
            return _myString;
        }
        set
        {
            _myString = value;
            OnPropertyChanged("MyString");
        }
    }
}