C# 使用数据绑定处理样式

C# 使用数据绑定处理样式,c#,.net,wpf,listview,datatemplate,C#,.net,Wpf,Listview,Datatemplate,重写 我有一个接收文件的应用程序。此文件包含大量可编辑内容。此内容有多种可能的类型(即布尔复选框、文本框等)。问题是,这些值可以是单独的,也可以是一个组(最多8个),因此它们以数组的形式出现。我们将这些值绑定到列表视图,并使用数据模板显示它们。实际上,我从数组列表创建了ListView 这些数组中的项需要进行数据绑定并正确设置样式(例如,布尔数组需要创建复选框,而字符串数组需要文本框)。每个创建的元素都需要放入列表视图中的一列中。当前样式是使用带有数据绑定的数据模板,即 <DataTemp

重写

我有一个接收文件的应用程序。此文件包含大量可编辑内容。此内容有多种可能的类型(即布尔复选框、文本框等)。问题是,这些值可以是单独的,也可以是一个组(最多8个),因此它们以数组的形式出现。我们将这些值绑定到
列表视图
,并使用
数据模板
显示它们。实际上,我从数组列表创建了
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>