WPF Listview Checkbox列绑定 [英] WPF Listview Checkboxcolumn Binding
问题描述
我在将Checkbox列绑定到Listview时遇到问题。我究竟做错了什么? XAML代码:
I'm having trouble binding a Checkboxcolumn to a Listview. What am I doing wrong? XAML-Code:
<ListView Name="listViewClients" Grid.Row="1" Margin="0,5,0,10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Auswahl" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding isChecked}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Anrede" Width="50" DisplayMemberBinding="{Binding salutation}" />
<GridViewColumn Header="Titel" Width="50" DisplayMemberBinding="{Binding title}" />
<GridViewColumn Header="Vorname" Width="100" DisplayMemberBinding="{Binding first_name}" />
<GridViewColumn Header="Nachname" Width="110" DisplayMemberBinding="{Binding last_name}" />
<GridViewColumn Header="UnitNr" Width="105" DisplayMemberBinding="{Binding commercialunitnumber}" />
</GridView>
</ListView.View>
</ListView>
C#代码:
listViewClients.Items.Clear();
for (int a = 0; a < clients.Count; a++)
{
listViewClients.Items.Add(new
{
isChecked = false,
salutation = clients[a].salutation,
title = clients[a].title,
first_name = clients[a].first_name,
last_name = clients[a].last_name,
commercialunitnumber = clients[a].commercialunitnumber,
});
}
这对其他所有列均适用,但在尝试执行以下操作时会引发错误绑定IsChecked属性。为什么?我收到的错误是德语,但是这里是〜翻译:
This works fine for all the other Columns, but throws an error when trying to bind the IsChecked property. Why? The Error I get is in German, but here´s the ~ translation:
XamlParseException:TwoWay-或OneWayToSource-Connections不适用于写保护属性 isChecked。
XamlParseException: TwoWay- or OneWayToSource-Connections don't work with the write-protected property "isChecked".
编辑:
好,我发现了错误现在。我创建了一个名为Clients的类,这是C#代码:
Ok, I´ve found the error now. I created a class named Clients, here´s the C#-code:
class Clients
{
public Boolean isChecked { get; set; }
[JsonProperty("salutation")]
public string salutation { get; set; }
[JsonProperty("title")]
public string title { get; set; }
[JsonProperty("last_name")]
public string last_name { get; set; }
[JsonProperty("first_name")]
public string first_name { get; set; }
[JsonProperty("commercialunitnumber")]
public string commercialunitnumber { get; set; }
}
然后我只是将填充ListView的C#代码更改为:
Then I just changed the C#-Code thats filling the ListView to:
listViewClients.Items.Clear();
for (int a = 0; a < clients.Count; a++)
{
listViewClients.Items.Add(new Clients
{
isChecked = false,
salutation = clients[a].salutation,
title = clients[a].title,
first_name = clients[a].first_name,
last_name = clients[a].last_name,
commercialunitnumber = clients[a].commercialunitnumber,
});
}
我唯一更改的是listViewClients.Items.Add(new 客户 {...});
The only thing I changed is listViewClients.Items.Add(new Clients {...});
推荐答案
请创建具有可写属性的适当视图模型类,因为如上所述匿名类型将创建只读属性。
Please Create your proper view model class with writable properties because as mentioned "Anonymous type will create read-only properties".
我在这里添加了一个客户端视图模型示例,实现了 INotifyProprtychanged
(我没有添加所有属性)
i added here an example of Clients View model implements INotifyProprtychanged
(i didn't add all the property)
// This is a simple Clients class that
// implements the IPropertyChange interface.
public class Clients: INotifyPropertyChanged
{
// These fields hold the values for the public properties.
private bool isChecked = false;
private string title = String.Empty;
private string first_name = String.Empty;
private string last_name = String.Empty;
public event PropertyChangedEventHandler PropertyChanged;
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
// The constructor is private to enforce the factory pattern.
private Clients()
{
}
// This is the public factory method.
public static Clients CreateNewCustomer()
{
return new Clients();
}
// This property represents an ID, suitable
// for use as a primary key in a database.
public bool IsChecked
{
get
{
return this.isChecked;
}
set
{
if (value != this.isChecked)
{
this.isChecked = value;
NotifyPropertyChanged();
}
}
}
public string Title
{
get
{
return this.title;
}
set
{
if (value != this.title)
{
this.title = value;
NotifyPropertyChanged();
}
}
}
public string FirstName
{
get
{
return this.first_name;
}
set
{
if (value != this.first_name)
{
this.first_name = value;
NotifyPropertyChanged();
}
}
}
public string LastName
{
get
{
return this.last_name;
}
set
{
if (value != this.last_name)
{
this.last_name = value;
NotifyPropertyChanged();
}
}
}
}
然后您只需在创建列表时使用它即可:
Then you just need to use it at your list creation:
listViewClients.Items.Clear();
for (int a = 0; a < clients.Count; a++)
{
listViewClients.Items.Add(new Clients
{
isChecked = false,
salutation = clients[a].salutation,
title = clients[a].title,
first_name = clients[a].first_name,
last_name = clients[a].last_name,
commercialunitnumber = clients[a].commercialunitnumber,
});
}
这篇关于WPF Listview Checkbox列绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!