【发布时间】:2016-08-20 09:06:36
【问题描述】:
我有一个动态生成的 ListView,它使用数据绑定来允许通过 CheckBox 编辑一些 Boolean 值。我使用 IValueConverter 生成 ListView 的列(如this 答案):
public object Convert (object Value, Type EntryType, object Parameter, System.Globalization.CultureInfo Culture)
{
var Config = Value as ColumnConfig;
if (Config != null)
{
var GridView = new GridView ();
Binding NameBinding = new Binding ("Name");
GridViewColumn BaseColumn = new GridViewColumn { Header = "Settings",
DisplayMemberBinding = NameBinding,
Width = 125,
CellTemplate = new DataTemplate ()};
GridView.Columns.Add (BaseColumn);
foreach (Column CurrentColumn in Config.Columns)
{
Binding NewBinding = new Binding (CurrentColumn.DataField);
FrameworkElementFactory FEF = new FrameworkElementFactory (typeof (CheckBox));
FEF.SetBinding (CheckBox.IsCheckedProperty, NewBinding);
GridViewColumn GVColumn = new GridViewColumn
{
Header = CurrentColumn.Header,
DisplayMemberBinding = NewBinding
};
var DTemplate = new DataTemplate ();
DTemplate.VisualTree = FEF;
GVColumn.CellTemplate = DTemplate;
GridView.Columns.Add (GVColumn);
}
return GridView;
}
return Binding.DoNothing;
}
在 XAML 中这样使用:
<ListView Margin="2" ItemContainerStyle="{StaticResource LineHighlightListView}"
ItemsSource="{Binding InMatrixList}"
View="{Binding InMatrixColumns, Converter={StaticResource ConvertItemsToDynamicGridView}}" />
列的标题在别处生成。代码应该接受ColumnConfig 项目,并创建GridViewColumn 对象,这些对象具有ChechBox 数据绑定到其他地方的某个其他值。但是,我得到的只是用文本代替复选框的列。文本正确,因此数据绑定有效,但 FrameworkElementFactory 对象未按预期工作。
为什么将复选框呈现/转换为文本框?
【问题讨论】:
-
这是一种非常糟糕的做法。改用 MVVM 和数据模板
-
@Glen Thomas 我已经在使用 MVVM。我认为没有办法使用 DataTemplates 正确地做到这一点,是吗? DataTemplate 将适用于所有单元格,包括纯文本的第一列。
-
您是否觉得自己正在掉进兔子洞?因为你要掉进兔子洞了。创建一个自定义控件或用户控件,它根据绑定对象的状态在代码隐藏中操纵 UI。
-
@Will 在尝试了该解决方案之后,如果不执行上述大部分操作,我仍然看不到您将如何做到这一点 - 唯一的变化是我在代码隐藏中而不是在转换器...
标签: c# wpf listview checkbox mvvm