【问题标题】:Set my Column's value using datatrigger使用 datatrigger 设置我的列的值
【发布时间】:2014-08-21 00:13:59
【问题描述】:

我有一个数据网格,我希望能够使用 XAML 检测我的列是否显示 0,并且在这种情况下将零替换为“-”。

这是我的数据网格:

<DataGrid  Style="{DynamicResource StyleDataGrid}"   ItemsSource="{Binding Path=_Data, UpdateSourceTrigger=PropertyChanged}" Margin="10,54,10,10" Name="dataGridView1" >
                <DataGrid.Columns>

                    <DataGridTextColumn Width="35" Binding="{Binding Path=Object.MyValue}" SortMemberPath="Object.MyValue" Header="" IsReadOnly="true">
                        <DataGridTextColumn.CellStyle>
                            <Style BasedOn="{StaticResource {x:Type DataGridCell}}" TargetType="DataGridCell">
                                <Setter Property="Foreground" Value="{Binding BrushTroisPts}"/>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=TextBlock.Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBlock}}}" Value="0">
                                        <Setter Property="TextBlock.Text" Value="-"/>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style>
                        </DataGridTextColumn.CellStyle>
                    </DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>

但这不起作用,我怎样才能使它起作用?

谢谢

【问题讨论】:

    标签: wpf xaml triggers datatrigger


    【解决方案1】:

    您可以使用转换器来执行此操作。查看 DataGridTextColumn 上的绑定、MyConverter 的代码和注册转换器的 window.resources。我虚拟化了一些类来匹配你已经拥有的。

    XAML:

    <Window x:Class="WpfApplication3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:app="clr-namespace:WpfApplication3"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="DataGrid" x:Key="StyleDataGrid" />
            <app:MyConverter x:Key="MyConverter" />
        </Window.Resources>
        <Grid>
            <DataGrid  Style="{DynamicResource StyleDataGrid}"   ItemsSource="{Binding Path=_Data, UpdateSourceTrigger=PropertyChanged}" Margin="10,54,10,10" Name="dataGridView1" >
                <DataGrid.Columns>
                    <DataGridTextColumn Width="35" Binding="{Binding Path=Object.MyValue, Converter={StaticResource MyConverter}}" SortMemberPath="Object.MyValue" Header="" IsReadOnly="true">
                        <DataGridTextColumn.CellStyle>
                            <Style BasedOn="{StaticResource {x:Type DataGridCell}}" TargetType="DataGridCell">
                                <Setter Property="Foreground" Value="{Binding BrushTroisPts}"/>
                            </Style>
                        </DataGridTextColumn.CellStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    代码(C#):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication3
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public List<MyData> _Data { get; set; }
            public MainWindow()
            {
                InitializeComponent();
                _Data = new List<MyData>();
                for (int i = 0; i < 10; i++)
                {
                    _Data.Add(new MyData(i.ToString()));
                }
                this.DataContext = this;
            }
        }
    
        //Object.MyValue
    
        public class MyData
        {
            public MyObject Object { get; set; }
    
            public MyData(string val)
            {
                Object = new MyObject(val);
            }
        }
        public class MyObject
        {
            public string MyValue { get; set; }
    
            public MyObject(string val)
            {
                MyValue = val;
            }
        }
    
        public class MyConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if ("0".Equals(value))
                    return "-";
                return value;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }
    

    【讨论】:

    • 非常感谢!但是我添加添加“ToString()”值以使其工作:)
    • 您使用的是整数吗?如果是这样,您也许可以使用 0.Equals(value) 而不是“0”.Equals(value.ToString())。这应该会稍微快一些……尽管您可能甚至不会注意到其中的差异。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2013-11-20
    • 1970-01-01
    • 2011-01-09
    • 2010-12-25
    • 2011-09-10
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多