【问题标题】:Select control style by binding value通过绑定值选择控件样式
【发布时间】:2012-09-13 14:32:43
【问题描述】:

我有一个可用于多个编辑对象的编辑器视图。多个对象的视图模型为需要处理的每个字段提供了一个类似于 Field1Multiple 的 bool 类型的属性。在这种情况下,它现在只是 ComboBox 控件。每当应为该字段指示多个不同的值时,应将某种样式应用于在 App.xaml 中定义的该控件。该样式更改了控件的背景,以显示此处没有可以显示的单个值。

我已尝试使用此 XAML 代码:

<ComboBox
  ItemsSource="{Binding Project.Field1Values}" DisplayMemberPath="DisplayName"
  SelectedItem="{Binding Field1}">
  <ComboBox.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Field1Multiple}" Value="true">
          <Setter
            Property="ComboBox.Style"
            Value="{StaticResource MultiValueCombo}"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ComboBox.Style>
</ComboBox>

但它不起作用,因为我无法从 Style 内部设置 Style 属性。如果我直接在控件上使用触发器,编译器说可能只有 EventTriggers,没有 DataTriggers。

如何根据绑定值设置控件的样式?或者,如果绑定值为真,如何为控件设置某种样式?

【问题讨论】:

  • 只需要更改组合框的背景吗?
  • 您的Style 有多复杂?通常我只是将更改的设置器添加到触发器,其中可以包括ItemTemplate
  • 检查这个stackoverflow.com/questions/3397497/…他做了类似的事情
  • 问题是,该样式将用于具有多重编辑支持的每个字段,并且会被使用数百次...我不想经常复制一行样式.

标签: wpf data-binding triggers


【解决方案1】:

(编辑完整解决方案)

你可以使用转换器:

  public class AnyIsMultipleToStyle : IValueConverter
    {
        public Style NormalStyle { get; set; }

        public Style MultiStyle { get; set; }


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                IList<SampleClass> list= value as IList<SampleClass>;
                if (list!=null)
                {
                    if (list.Any(i => i.Multi))
                        return MultiStyle;

                }

            }
            return NormalStyle;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

并且在您的 xaml 中:(您向转换器指示正常样式和多样式)

 <Window.Resources>

        <Style x:Key="MultiValueCombo"  TargetType="{x:Type ComboBox}">

            <Setter Property="Background" Value="Olive" />
        </Style>

        <Style x:Key="NormalCombo"  TargetType="{x:Type ComboBox}">
            <Setter Property="Background" Value="Red" />
        </Style>
        <my:AnyIsMultipleToStyle x:Key="AnyIsMultipleToStyle1" MultiStyle="{StaticResource MultiValueCombo}" NormalStyle="{StaticResource NormalCombo }"  />





    </Window.Resources>
    <Grid>

        <ComboBox    ItemsSource="{Binding Items, ElementName=root}"  >
            <ComboBox.Style>
                <Binding Converter="{StaticResource AnyIsMultipleToStyle1}" Path="Items" ElementName="root" >

                    </Binding>
            </ComboBox.Style>

        </ComboBox>
    </Grid>

【讨论】:

  • 嗯,如果我理解正确,我可以使用转换器将布尔值(真或假)转换为一种或另一种风格。我将在转换器中返回什么以获得与没有 Style 属性相同的效果?空?
  • 我建议实现和使用您自己的 StyleSelector。在这种情况下,它比 Converter 更优雅Check this
  • 您可以在转换器中声明两个属性(NormalStyle 和 MultiStyle)并返回其中一个。
  • ígor:我只有一个 Multistyle,但对正常值根本没有规范。我该怎么做?
  • Miklós:StyleSelector 似乎只适用于 ItemsControls 中的项目,不适用于 ComboBox 控件本身。
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 2010-10-04
  • 2013-09-03
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多