如何在WPF中有条件地更改按钮前景颜色?

拉维五世

我内部有一个按钮ItemsControl(分页类型控件)current_page,我的视图模型中有一个命名的属性

我想比较current_page值到ContentButton是(1/2/3),并希望改变一个按钮的前景色。

请看一下代码。

我的ViewModel

public PaginationModel pagination
{
  get { return _pagination; }
  set { _pagination = value; OnPropertyChanged("pagination"); }
}

我的分页模型

public class PaginationModel: INotifyPropertyChanged {
  private int _total_items;
  public int total_items {
    get {
      return _total_items;
    }
    set {
      _total_items = value;
      OnPropertyChanged("total_items");
    }
  }

  private int _items_per_page;
  public int items_per_page {
    get {
      return _items_per_page;
    }
    set {
      _items_per_page = value;
      OnPropertyChanged("items_per_page");
    }
  }

  private int _current_page;
  public int current_page {
    get {
      return _current_page;
    }
    set {
      if (value <= total_pages + 1 && value > 0) {
        _current_page = value;
        OnPropertyChanged("current_page");
      }
    }
  }

  private int _total_pages;
  public int total_pages {
    get {
      return _total_pages;
    }
    set {
      _total_pages = value;
      OnPropertyChanged("total_pages");
    }
  }

  private ObservableCollection < string > _PageList;

  public ObservableCollection < string > PageList {
    get {
      _PageList = new ObservableCollection < string > ();
      for (int i = 0; i < total_pages; i++) {
        _PageList.Add((i + 1).ToString());
      }
      return _PageList;
    }
    set {
      _PageList = value;
      OnPropertyChanged("PageList");
    }
  }
}

我的版式

<ItemsControl ItemsSource="{Binding pagination.PageList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0">
                <Button Content="{Binding}"  CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
                                             Command="{Binding DataContext.ChangePage, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
                                             Width="20"
                                             Margin="10,0"></Button>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

按钮样式模板

<Style TargetType="{x:Type Button}" >
    <Setter Property="Foreground" Value="{StaticResource WordOrangeBrush}"  />
    <Setter Property="Background" Value="Transparent"></Setter>
    <Setter Property="BorderThickness" Value="0"></Setter>
    <Setter Property="FontFamily" Value="{StaticResource HelveticaNeue}"></Setter>
    <Setter Property="FontSize" Value="14"></Setter>
    <Setter Property="Foreground" Value="#ff9f00"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
                    <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Transparent"></Setter>
            <Setter Property="Foreground" Value="#ff9f00" />
        </Trigger>
        <Trigger Property="IsMouseOver" Value="False">
            <Setter Property="Background" Value="Transparent"></Setter>
            <Setter Property="Foreground" Value="White" />
        </Trigger>
        <!--I want to bind current page value in place of 1-->
        <DataTrigger Binding="{Binding}" Value="1">
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
那个家伙

价值转换器解决方案

你不能绑定ValueDataTrigger一个属性,因为它不是一个依赖项属性。您可以通过创建用于检查页面是否相等的自定义多值转换器来解决此问题。

public class PageEqualityToBooleanConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
      return (int)values[0] == System.Convert.ToInt32(values[1]);
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
   {
      throw new InvalidOperationException();
   }
}

传递给转换器的第一个值是当前页面as int,第二个值是Buttonas上的页面stringcurrent_page的类型是,这是一个奇怪的现象int,但是类型PageList是的集合string,这就是为什么我们需要转换第二个值。

样式之前在资源中创建转换器的实例,以便您可以引用它。

<local:PageEqualityToBooleanConverter x:Key="PageEqualityToBooleanConverter"/>

最后,用DataTrigger下面的替换您的。我们使用aMultiBinding来绑定多个值。True如果页面值匹配,则转换器会将这两个值转换为,否则将False

<DataTrigger Value="True">
   <DataTrigger.Binding>
      <MultiBinding Converter="{StaticResource PageEqualityToBooleanConverter}">
         <Binding Path="DataContext.pagination.current_page" RelativeSource="{RelativeSource AncestorType={x:Type ItemsControl}}"/>
         <Binding/>
      </MultiBinding>
   </DataTrigger.Binding>
   <Setter Property="Foreground" Value="Red"/>
</DataTrigger>

第一个绑定将找到父级ItemsControl以访问包含的视图模型current_page第二个绑定将绑定到关联按钮的数据上下文,即页面字符串。如果您将PageList项目类型更改为该类型,int则仍然可以使用。

推荐建议

我想指出一些有关您的代码的意见,可能有助于您进行改进。

  • 正如我已经提到的,收集项类型与当前项属性类型不同似乎很奇怪。int如果您计划拥有除页面编号之外的其他属性,请考虑制作它或创建单独的页面项目视图模型。
  • 您正在为定义隐式样式Button,该样式将应用于Button范围内的所有控件。如果您在分页控制使用它只有这可能是好的,但如果你打算在其他地方使用它时,DataTrigger不应该被包含在里面,因为它是专门针对仅此数据上下文。基于此创建单独的样式。考虑@BionicCode对此的评论。
  • 正如@Andy在评论中指出的,aListBox可能更适合分页器,因为它具有a的概念SelectedItem(以及IsSelected其项目容器中可以绑定到a的属性DataTrigger),这就是您要在此处进行的操作手动。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在React Native底部选项卡中有条件地更改屏幕按钮?

来自分类Dev

如何在React Native底部选项卡中有条件地更改屏幕按钮?

来自分类Dev

如何在Angular中有条件地渲染?

来自分类Dev

如何在Excel中有条件地匹配

来自分类Dev

如何在Excel中有条件地VLOOKUP?

来自分类Dev

如何在有条件的js中有条件地应用标题

来自分类Dev

GWT如何有条件地更改文本颜色

来自分类Dev

如何在列表项中有条件地更改rightIcon。我正在使用本机元素

来自分类Dev

如何在JQ中有条件地将字符串值更改为数字?

来自分类Dev

如何在useEffect中更新状态的条件组件中有条件地渲染?

来自分类Dev

有条件地更改angularjs元素的颜色?

来自分类Dev

有条件地更改链接颜色?

来自分类Dev

有条件地更改颜色Apex / Visualforce

来自分类Dev

有条件地更改颜色CSS

来自分类Dev

有条件地更改折线颜色

来自分类Dev

如何在R中的数据框中有条件地选择列

来自分类Dev

如何在AngularJS模板中有条件地显示跨度?

来自分类Dev

如何在Meteor 1.0中有条件地加载/捆绑CSS文件?

来自分类Dev

如何在Swift中有条件地为tvOS编译

来自分类Dev

如何在angularJS指令中有条件地应用属性?

来自分类Dev

如何在React Native Component中有条件地包含图像?

来自分类Dev

如何在Spring Data REST投影中有条件地公开数据?

来自分类Dev

如何在Aurelia repeat.for中有条件地添加或删除CSS类?

来自分类Dev

如何在asp.net MVC视图中有条件地设置模型?

来自分类Dev

如何在熊猫中有条件地从不同的列中进行选择

来自分类Dev

如何在Vim中有条件地编辑文件

来自分类Dev

如何在Django Admin 1.5中有条件地否决删除尝试?

来自分类Dev

如何在一行中有条件地设置变量值?

来自分类Dev

如何在AngularJS中有条件地应用指令?

Related 相关文章

  1. 1

    如何在React Native底部选项卡中有条件地更改屏幕按钮?

  2. 2

    如何在React Native底部选项卡中有条件地更改屏幕按钮?

  3. 3

    如何在Angular中有条件地渲染?

  4. 4

    如何在Excel中有条件地匹配

  5. 5

    如何在Excel中有条件地VLOOKUP?

  6. 6

    如何在有条件的js中有条件地应用标题

  7. 7

    GWT如何有条件地更改文本颜色

  8. 8

    如何在列表项中有条件地更改rightIcon。我正在使用本机元素

  9. 9

    如何在JQ中有条件地将字符串值更改为数字?

  10. 10

    如何在useEffect中更新状态的条件组件中有条件地渲染?

  11. 11

    有条件地更改angularjs元素的颜色?

  12. 12

    有条件地更改链接颜色?

  13. 13

    有条件地更改颜色Apex / Visualforce

  14. 14

    有条件地更改颜色CSS

  15. 15

    有条件地更改折线颜色

  16. 16

    如何在R中的数据框中有条件地选择列

  17. 17

    如何在AngularJS模板中有条件地显示跨度?

  18. 18

    如何在Meteor 1.0中有条件地加载/捆绑CSS文件?

  19. 19

    如何在Swift中有条件地为tvOS编译

  20. 20

    如何在angularJS指令中有条件地应用属性?

  21. 21

    如何在React Native Component中有条件地包含图像?

  22. 22

    如何在Spring Data REST投影中有条件地公开数据?

  23. 23

    如何在Aurelia repeat.for中有条件地添加或删除CSS类?

  24. 24

    如何在asp.net MVC视图中有条件地设置模型?

  25. 25

    如何在熊猫中有条件地从不同的列中进行选择

  26. 26

    如何在Vim中有条件地编辑文件

  27. 27

    如何在Django Admin 1.5中有条件地否决删除尝试?

  28. 28

    如何在一行中有条件地设置变量值?

  29. 29

    如何在AngularJS中有条件地应用指令?

热门标签

归档