如何将 textblock.foreground 绑定到变量? (WPF C#)

2024-04-30

所以我希望改变我的程序,以便我可以运行一个函数来检查前景色是否应该是黑色或银色。我希望将不可“访问”的字段灰显。

My form currently looks like: enter image description here

我希望将“无需维护”字段“灰显”。但我在尝试在数据模板中定义字体前景的绑定元素时遇到问题。

我已经尝试了一切,从尝试在后面的主窗口代码中定义 IValueConverter 类,到定义窗口键资源,但似乎我无法在文本块元素本身的数据模板中执行此操作?

任何建议/帮助将不胜感激。谢谢!

XAML:

<Grid Margin="0,0,2,0">

    <ListBox x:Name="allSites_LB" 
             HorizontalAlignment="Left" 
             Height="400" 
             Margin="20,60,0,0" 
             VerticalAlignment="Top" 
             Width="945"
             Loaded="allSites_LB_Loaded" 
             BorderThickness="1" SelectionChanged="allSites_LB_SelectionChanged"
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             >
        <ListBox.ItemTemplate >
            <DataTemplate >
                <Border BorderBrush="Black" BorderThickness="0,0,0,1" Margin="-20,1,0,1" Padding="0,5,0,5" >
                    <Grid Margin="75,3" >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200" />
                            <ColumnDefinition Width="400" />
                            <ColumnDefinition Width="345" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding SiteNo}" Grid.Column="0" FontSize="16" />
                        <TextBlock Text="{Binding Address}" Grid.Column="1" FontSize="16" Margin="50,1" />
                        <TextBlock Text="{Binding MaintStatus}" Grid.Column="2" FontSize="16" />
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <Button x:Name="viewHistory_BTN" 
            Content="View History" 
            HorizontalAlignment="Left" 
            Height="52" 
            Margin="20,496,0,0" 
            VerticalAlignment="Top" 
            Width="172" FontSize="20"
            />

    <Button x:Name="startMaintenance_BTN" 
            Content="Start Maintenance"
            HorizontalAlignment="Left" 
            Height="52" 
            Margin="793,496,0,0" 
            VerticalAlignment="Top" 
            Width="172" FontSize="20"
            />
    <TextBox x:Name="Site_Address" 
             HorizontalAlignment="Left" 
             Height="21" 
             Margin="51,39,0,0" 
             TextWrapping="Wrap" 
             Text="Site Number" 
             VerticalAlignment="Top" 
             Width="75" 
             BorderBrush="White" 
             IsReadOnly="True" 
             IsEnabled="False"

             />
    <TextBox x:Name="Address_Title" 
             HorizontalAlignment="Left" 
             Height="21" 
             Margin="380,34,0,0" 
             TextWrapping="Wrap" 
             Text="Address" 
             VerticalAlignment="Top" 
             Width="75" 
             BorderBrush="White"
             IsReadOnly="True" 
             IsEnabled="False"

             />
    <TextBox x:Name="maint_Title" 
             HorizontalAlignment="Left" 
             Height="21" 
             Margin="699,34,0,0" 
             TextWrapping="Wrap" 
             Text="Maintenance Record" 
             VerticalAlignment="Top" 
             Width="117" 
             BorderBrush="White" 
             IsReadOnly="True" 
             IsEnabled="False"
             />

</Grid>

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;
using System.Data.SqlClient;



namespace SiteMaintenance
{

public partial class MainWindow : Window
{

    /**
     * CLASS VARIABLES
     * */
    private SqlConnection localdbConnection;        // Connection to Site Maintenance DB (LOCAL)
    private System.Data.DataSet allSitesResults;



    // MAIN THREAD
    public MainWindow()
    {
        InitializeComponent();

        // try to open SQL Connection
        try {
            localdbConnection = new SqlConnection(Properties.Settings.Default.localdb);
            localdbConnection.Open();
        } catch(Exception ex) {
           System.Windows.MessageBox.Show("local SQL connection unable to connect");
           return;
        }

        viewHistory_BTN.IsEnabled = false;
        startMaintenance_BTN.IsEnabled = false;
        startMaintenance_BTN.IsDefault = true;
    }

    /**
     * Load dataset into datagrid 
     * LAZY LOADING
     * */
    private void DataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        // init command object
        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandText = "dbo.usp_GetSites";
        myCommand.CommandType = System.Data.CommandType.StoredProcedure;
        myCommand.Connection = localdbConnection;

        // init data adaptor
        SqlDataAdapter sites = new SqlDataAdapter();
        sites.SelectCommand = myCommand;

        //init DataSet
        allSitesResults = new System.Data.DataSet();

        sites.Fill(allSitesResults, "tblSites");

        int tableCount = allSitesResults.Tables.Count;

        System.Data.DataTable test = allSitesResults.Tables[0];

        int rowCount = test.Rows.Count;





    }

    private void sites_DG_CurrentCellChanged(object sender, EventArgs e)
    {
        String siteName = allSitesResults.Tables[0].Rows[0][1].ToString();

    }

    private void allSites_LB_Loaded(object sender, RoutedEventArgs e)
    {
        // init command object
        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandText = "dbo.usp_GetSitesANDCompletedDate";
        myCommand.CommandType = System.Data.CommandType.StoredProcedure;
        myCommand.Connection = localdbConnection;

        // init data adaptor
        SqlDataAdapter sites = new SqlDataAdapter();
        sites.SelectCommand = myCommand;

        //init DataSet
        allSitesResults = new System.Data.DataSet();

        sites.Fill(allSitesResults, "tblSites");

        allSites_LB.ItemsSource = allSitesResults.Tables["tblSites"].DefaultView;

    }


    // do not allow selection of maintenance records that do not exist
    private void allSites_LB_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        // grab the index
        int selectedIndex = allSites_LB.SelectedIndex;
        if (selectedIndex == -1) return;                //WITHOUT THIS CHECK, UN-SELECTION WILL CAUSE LOGIC FAILURE

        System.Data.DataRowView tempData = (System.Data.DataRowView)allSites_LB.Items[allSites_LB.SelectedIndex];

        // grab the completed date field
        String completedDate = tempData["CompletedDate"].ToString();
        String siteMaintID = tempData["SiteMaintID"].ToString();

        // remove selected index if completed date and site Maint ID is null
        if (siteMaintID != "" && completedDate == "")
        {
            startMaintenance_BTN.IsEnabled = true;
        }
        else 
        {
            allSites_LB.SelectedIndex = -1;
            startMaintenance_BTN.IsEnabled = false;
        }

    }


    private String maintRequired(object sender, SelectionChangedEventArgs e)
    {
        int selectedIndex = allSites_LB.SelectedIndex;
        if (selectedIndex < 0) return null;

        System.Data.DataRowView tempData = (System.Data.DataRowView)allSites_LB.Items[allSites_LB.SelectedIndex];

        // grab the completed date field
        String completedDate = tempData["CompletedDate"].ToString();
        String siteMaintID = tempData["SiteMaintID"].ToString();

        if (siteMaintID != "" && completedDate == "")
        {
            return "Maintenance Required";
        }
        else
        {
            return "No Maintenance";
        }
    }

}

}


将前景色绑定到数据时,通常有两种好方法可供选择。根据你问的人,不同的人会有不同的偏好。所以...两者都是!

第一种方法:带有触发器的样式

当满足一组特定条件时,此方法基本上可以识别“特殊”行为。在本例中,当状态 ==“无需维护”时,我们将前景色更改为灰色

<Style TargetType="TextBlock">
    <Setter Property="Foreground" Value="Black" /> <!-- default value -->
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}" Value="No Maintenance Required">
            <Setter Property="Foreground" Value="Gray" /> <!-- special behavior -->
        </DataTrigger>
    </Style.Triggers>
</Style>

在这种情况下,只需为您的 TextBlock 分配适当的Style财产。

第二种方法:使用 IValueConverter

这种方法创建了一个自定义的“IValueConverter 实现,它将您的文本值转换为颜色。从那里,我们直接绑定到我们的文本值,并确保转换器始终提供正确的颜色。

public class MaintenaceColorConverter : IValueConverter
{

    public Color NormalColor { get; set; }
    public Color NoMaintenanceRequiredColor { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.ToString() == "No Maintenance Required")
            return NoMaintenanceRequiredColor;

        return NormalColor;
    }

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

在您的 XAML 中:

<Window.Resources>
    <local:MaintenaceColorConverter x:Key="myColorConverter" NormalColor="Black" NoMaintenanceRequiredColor="Gray" />
</Window.Resources>

在你的文本块中:

<TextBlock Text="{Binding MaintStatus}" Foreground="{Binding MaintStatus, Converter={StaticResource myColorConverter}}" />

改进

使用这两种方法中的任何一种,最好有一个MaintenanceStatus布尔值或枚举值,并将样式条件绑定到该值。使用字符串比较不是一个好主意。这简直就是自找麻烦。这些示例使用字符串比较,因为......好吧......这就是您提供的示例代码中可用的全部内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 textblock.foreground 绑定到变量? (WPF C#) 的相关文章

随机推荐

  • Web API 获取多部分/表单数据响应的最简单方法

    我有问题 但我看不到我做错了什么 我想用最简单的方法来让它工作 稍后我会让它变得更复杂 但目前只想命中 post 方法 我什至不关心里面的代码当前是否正在工作 我唯一关心的是它会发回 OK 200 回复 目前 我要么收到内部服务器错误 50
  • jQuery Chosen 插件动态添加选项

    我做了一个jQuery选择的下拉菜单如下所示 blah chosen 我找不到如何添加选项 例如 blah chosen add name value 首先 您需要添加
  • 如何使用我的 Android 应用程序在 Google Drive 上上传文件

    我从谷歌驱动器 SDK https developers google com drive quickstart android 我按照该帖子中描述的步骤进行操作 但我面临的问题是Step 3 Create and Configure an
  • 如何保护Linux中的堆内存?

    我想将一块堆内存设置为只读 为此我尝试过memalign with mprotect 但是从 memalignment 中我能得到什么 memalign 从进程堆中分配内存 我想将堆的某些部分设为只读 有什么帮助吗 malloc gt mm
  • JDA Events 更新版本后停止工作 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个使用最新版本的 JDA 4 2 0 168 用 Ja va 开发的不和谐机器人 我的机器人中有几个事件 但只有一
  • 具有一个可见单元格的 UITableView:确定哪一个最可见

    给定一个在任何给定时间都有一个可见单元格的 UITableView 我如何确定哪个单元格是most滚动表视图时在视图中 我知道我可以通过这样做获得一系列可见单元格 NSArray paths tableView indexPathsForV
  • 在 Objective c 中计算 LRC

    我想计算通过蓝牙发送的消息的 LRC 例如 这是一条消息 消息结构为STX MESSAGE FS EXT LRC 02 1212004123422826E0B8C0F000F0A00182620000蒂龙系统沃特福德 UKR 1C 03 6
  • 装配中出现奇怪的字符?

    我写了以下代码 386 model small stack 100h data text db Paper 0 code start lea dx text mov ah 9h int 21h mov ah 4ch int 21h end
  • 如何通过 Selenium 通过 XPath 访问 WebElement?

    我需要访问该网站上搜索结果的链接 并将它们放入WebElement 但我无法按班级或任何其他方式找到它们 使用时xpath MyWebDriver findElement By xpath div class inner results f
  • Flask-SQLAlchemy .count() 和 .all() 的记录计数不同

    在 SQLAlchemy 中 ModelName query filter by field name value count 返回正确的记录数 但是ModelName query filter by field name value al
  • django 序列化器到 json - 自定义 json 输出格式

    我对 django 很陌生 最近我需要 JSON 输出 为此我使用以下 django 代码 data serializers serialize json Mymodel objects all 它工作得很好 除了我得到的输出 pk 897
  • ASP.NET C# 捕获类中的所有异常

    我知道这不是正确的做法 而且根本不干净 我只是想知道这是否可能 如果我有一个包含很多方法的类 public class Foo methodA methodB methodC 是否可以捕获所有可能发生的异常 而不必在每个方法中编写 try
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • 如何阻止TreeItem选择?

    我正在与一个TreeTableView JavaFX 8 有一些树节点必须禁用才能选择 我已经尝试过选择活动 但它不起作用 请查找以下代码以获取更多信息 treeTableView getSelectionModel selectedIte
  • div 上的两个线性渐变层

    我有一个彩色矩形 div 在其上放置 45 度的线性渐变以实现类似斑马的效果 我想将第二个渐变分层 角度为 135 度 与前一个渐变正交 height 30px background color rgb 255 0 0 background
  • 合并文件夹中多个文件的内容

    我有大约 30 个目录 其中包含 log 文件 我想进入每个文件夹并分别合并子目录中所有文件的文本 我不想合并所有子目录中所有文件的文本 Example 我有一个名为 Machines 的目录 in Machines I have Mach
  • 在 Python 3 中,两个正数相乘会得到负输出

    我有一个数据框df1 df1 head wght num links id y id x 3 133 0 000203 2 186 0 000203 2 5 6 0 000203 2 98 0 000203 2 184 0 000203 2
  • Selenium/ChromeDriver 未知策略错误

    我目前使用 Python v3 5 1 Selenium v3 7 和 Chromedriver v2 33 当我运行以下命令时 from selenium import webdriver driver webdriver Chrome
  • Apache Cassandra 如何进行聚合操作?

    总的来说 我对 Apache Cassandra 和 nosql 相当陌生 在 SQL 中 我可以执行聚合操作 例如 SELECT country sum age count AS averageAge FROM people GROUP
  • 如何将 textblock.foreground 绑定到变量? (WPF C#)

    所以我希望改变我的程序 以便我可以运行一个函数来检查前景色是否应该是黑色或银色 我希望将不可 访问 的字段灰显 My form currently looks like 我希望将 无需维护 字段 灰显 但我在尝试在数据模板中定义字体前景的绑