Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 数据更新时,样式模板不会重新计算_Wpf_Xaml_.net 3.5_Binding - Fatal编程技术网

Wpf 数据更新时,样式模板不会重新计算

Wpf 数据更新时,样式模板不会重新计算,wpf,xaml,.net-3.5,binding,Wpf,Xaml,.net 3.5,Binding,我有一个样式模板(如下),在标记绑定更新时不会更新。数据本身会更新,我没有收到任何绑定错误,因此希望所有内容都能正确绑定,只是样式似乎根本没有更新。我已经在所有正确的地方通知了PropertyChanged事件,所以我怀疑这是问题所在 谢谢 <Style x:Key="CompareTemplate" TargetType="TextBlock"> <!--Setter Property="Foreground" Value="#FF760000"

我有一个样式模板(如下),在标记绑定更新时不会更新。数据本身会更新,我没有收到任何绑定错误,因此希望所有内容都能正确绑定,只是样式似乎根本没有更新。我已经在所有正确的地方通知了PropertyChanged事件,所以我怀疑这是问题所在

谢谢

  <Style x:Key="CompareTemplate" TargetType="TextBlock">
            <!--Setter Property="Foreground" Value="#FF760000" /-->
            <Setter Property="Foreground" Value="#FFBCBCBC" />
        <Style.Triggers>
            <Trigger Value="True" Property="Tag">
                <Setter Property="Foreground" Value="#FF007602" />
            </Trigger>
            <Trigger Value="False" Property="Tag">
                <Setter Property="Foreground" Value="#FF760000" />
            </Trigger>
        </Style.Triggers>
    </Style>

我这样使用这个模板:

<TextBlock Style="{DynamicResource CompareTemplate}" Tag="{Binding UnitComparer.CommsID, FallbackValue=True}" Text="Comms ID:" />

标记的类型为object。我认为你的视图模型对它很有帮助。WPF能够在字符串和对象之间转换,但似乎不能在bool和对象之间转换。一种解决方案是使用IValueConverter将布尔值更改为字符串:

<Window x:Class="BindToTagSpike.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BindToTagSpike"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <StackPanel.Resources>
            <local:ObjectToString x:Key="ObjectToString"/>
            <Style x:Key="CompareTemplate" TargetType="TextBlock">
                <Style.Triggers>
                    <Trigger Value="True" Property="Tag">
                        <Setter Property="Foreground" Value="Red" />
                    </Trigger>
                    <Trigger Value="False" Property="Tag">
                        <Setter Property="Foreground" Value="YellowGreen" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </StackPanel.Resources>
        <TextBlock Style="{StaticResource CompareTemplate}"
                   Name="TaggedTextBlock"
                   Tag="{Binding TagValue,
                   Converter={StaticResource ObjectToString}}"/>
        <Button Click="Button_Click">Change Style</Button>        
    </StackPanel>
</Window>


using System;
using System.Windows;
using System.Windows.Data;
using System.ComponentModel;

namespace BindToTagSpike
{

    public partial class Window1 : Window, INotifyPropertyChanged
    {
        public Window1()
        {
            InitializeComponent();
            tagValue = false;
            TaggedTextBlock.Text = "Test";
            DataContext = this;

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
           TagValue=!TagValue; 
        }

        private bool tagValue;
        public bool TagValue
        {
            get { return tagValue; }
            set
            {
                tagValue = value;
                if (PropertyChanged != null)
                    PropertyChanged(this,new PropertyChangedEventArgs("TagValue"));
            }

        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }

    public class ObjectToString : IValueConverter
    {

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value.ToString();
        }

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

        #endregion
    }
}

改变风格
使用制度;
使用System.Windows;
使用System.Windows.Data;
使用系统组件模型;
名称空间BindToTagSpike
{
公共部分类Window1:Window,INotifyPropertyChanged
{
公共窗口1()
{
初始化组件();
tagValue=false;
TaggedTextBlock.Text=“测试”;
DataContext=this;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
TagValue=!TagValue;
}
私有布尔值;
公共布尔值
{
获取{return tagValue;}
设置
{
tagValue=值;
if(PropertyChanged!=null)
PropertyChanged(即新PropertyChangedEventArgs(“TagValue”);
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
#端区
}
公共类ObjectToString:IValueConverter
{
#区域转换器成员
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值.ToString();
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
#端区
}
}

当模板/样式未按预期应用时,WPF可能认为TargetType可能与控件类型不匹配。尝试下面的代码,看看这是否有帮助:

<Style x:Key="CompareTemplate" >
                    <!--Setter Property="Control.Foreground" Value="#FF760000" /-->
                    <Setter Property="Control.Foreground" Value="#FFBCBCBC" />
    <Style.Triggers>
        <Trigger Value="True" Property="Control.Tag">
            <Setter Property="Control.Foreground" Value="#FF007602" />
        </Trigger>
        <Trigger Value="False" Property="Control.Tag">
            <Setter Property="Control.Foreground" Value="#FF760000" />
        </Trigger>
    </Style.Triggers>
</Style>

干杯,
贝里尔