绑定 Listview 的 GridView 的 DataGridCell 的 TextBlock
Binding the TextBlock of a Listview's GridView's DataGridCell
我有一个 ObservableCollection
的模型对象,我试图在 ListView
的 GridView
的 DataGridCells
中显示。对于这个简化的示例,假设我的模型对象都有 "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");
}
}
}
我有一个 ObservableCollection
的模型对象,我试图在 ListView
的 GridView
的 DataGridCells
中显示。对于这个简化的示例,假设我的模型对象都有 "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");
}
}
}