C# 使用数据绑定处理样式
重写 我有一个接收文件的应用程序。此文件包含大量可编辑内容。此内容有多种可能的类型(即布尔复选框、文本框等)。问题是,这些值可以是单独的,也可以是一个组(最多8个),因此它们以数组的形式出现。我们将这些值绑定到C# 使用数据绑定处理样式,c#,.net,wpf,listview,datatemplate,C#,.net,Wpf,Listview,Datatemplate,重写 我有一个接收文件的应用程序。此文件包含大量可编辑内容。此内容有多种可能的类型(即布尔复选框、文本框等)。问题是,这些值可以是单独的,也可以是一个组(最多8个),因此它们以数组的形式出现。我们将这些值绑定到列表视图,并使用数据模板显示它们。实际上,我从数组列表创建了ListView 这些数组中的项需要进行数据绑定并正确设置样式(例如,布尔数组需要创建复选框,而字符串数组需要文本框)。每个创建的元素都需要放入列表视图中的一列中。当前样式是使用带有数据绑定的数据模板,即 <DataTemp
列表视图
,并使用数据模板
显示它们。实际上,我从数组列表创建了ListView
这些数组中的项需要进行数据绑定并正确设置样式(例如,布尔数组需要创建复选框,而字符串数组需要文本框)。每个创建的元素都需要放入列表视图中的一列中。当前样式是使用带有数据绑定的数据模板
,即
<DataTemplate x:Key="testTemplate2">
<TextBlock Text="{Binding Path=Value[0]}"
Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</DataTemplate>
示例图:
我有一个模型。此ViewModel有一个由ItemData组成的列表。类ItemData有一个名为Values的数组。列表已绑定到视图。我们需要根据要访问的ItemData的属性选择要使用的DataTemplate:
一个代表名字
一个或多个用于arrray的选项
目前,我们在ListView中显示列表。生成列表视图
时,列的单元格模板
上附加了不同的数据模板
,每个索引一个,总共有8个数据模板。我的答案集中在你的话上:因为有大量的输入类型,这意味着重复代码的数量太多了。
代码重用:
由于在项目模板中
需要为不同的数据类型定义不同类型的控件
,因此无法完全减少代码。我的意思是,如果你想要TextBox
用于String
类型或Checkbox
用于Bool
类型,那么代码不能明显减少。然而,您可以减少的是为不同的模板
一次又一次地定义绑定
语法,正如我在文本框
模板
示例中看到的那样。您可以定义一次Biniding
,然后使用n个控件(在您的情况下为8个)反复使用它们。以下是您如何做到这一点:
public class BindingResourceExtension : StaticResourceExtension
{
public BindingResourceExtension() : base() { }
public BindingResourceExtension(object resourceKey) : base(resourceKey) { }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var binding = base.ProvideValue(serviceProvider) as BindingBase;
if (binding != null)
return binding.ProvideValue(serviceProvider);
else
return null; //or throw an exception
}
}
XAML
现在对于内部ItemsControl
您必须实际定义模板,但我认为您已经清楚了这一部分。使用带有ItemsSource={Binding Values}
的ItemsControl?这就是我的意思。@MKII您能给出您定义的其他一些数据模板的代码吗,“我想看看它们有多复杂?”凯伦添加了一个数据模板的示例。这可能是第二个最复杂的问题。@MKII刚刚就不同控件的代码重用问题发布了一个答案。我认为您现在已经清楚了如何在UI上转换值[8](通过在ItemTemplate中为listbox的每个项使用Itemscontrol,然后将您的模板用于内部Itemscontrol)。所以在答案中省略了这一部分。
public class BindingResourceExtension : StaticResourceExtension
{
public BindingResourceExtension() : base() { }
public BindingResourceExtension(object resourceKey) : base(resourceKey) { }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var binding = base.ProvideValue(serviceProvider) as BindingBase;
if (binding != null)
return binding.ProvideValue(serviceProvider);
else
return null; //or throw an exception
}
}
<Window.Resources>
<ResourceDictionary>
<Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</ResourceDictionary>
</Window.Resources>
(...)
<TextBox Text="{ns:BindingResource MyBinding}" />
<CheckBox IsChecked="{ns:BindingResource MyBinding}" />
<ListBox ItemsSource="{Binding CollectionOfArrays}">
<ListBox.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Array}" />
</DataTemplate>
</ListBox.ItemTemplate>