Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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
C# 如果内容与其他属性值匹配,则更改标签前景_C#_Wpf_Xaml_Caliburn.micro - Fatal编程技术网

C# 如果内容与其他属性值匹配,则更改标签前景

C# 如果内容与其他属性值匹配,则更改标签前景,c#,wpf,xaml,caliburn.micro,C#,Wpf,Xaml,Caliburn.micro,我有一个DataGrid,它显示了一个包含一些细节的地图列表。我正在尝试更改当前处于活动状态的地图的前景色,但我正在努力。我编写了以下转换器来检查DataGrid项的值是否与当前映射的名称匹配,但我不确定如何从XAML传递当前映射的名称 转换器: public class StringToBrushConverter : IValueConverter { public string CurrentMapName { get; set; } public Color Curren

我有一个DataGrid,它显示了一个包含一些细节的地图列表。我正在尝试更改当前处于活动状态的地图的前景色,但我正在努力。我编写了以下转换器来检查DataGrid项的值是否与当前映射的名称匹配,但我不确定如何从XAML传递当前映射的名称

转换器:

public class StringToBrushConverter : IValueConverter
{
    public string CurrentMapName { get; set; }
    public Color CurrentMapColor { get; set; }
    public Color OtherMapColor { get; set; }

    string _value = "";

    public StringToBrushConverter(string currentMapName, Color currentMapColor, Color otherMapColor)
    {
        CurrentMapName = currentMapName;
        CurrentMapColor = currentMapColor;
        OtherMapColor = otherMapColor;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        _value = value as string;
        return (string)value == CurrentMapName ? new SolidColorBrush(CurrentMapColor) : new SolidColorBrush(OtherMapColor);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return _value; //TODO: Will this work?
    }
}

public sealed class RaceMapColorConverter : StringToBrushConverter
{
    public RaceMapColorConverter() : base("", new Color { R = 255, G = 0, B = 0 }, new Color { R = 255, G = 255, B = 255 }) { }
}
<DataGrid x:Name="MapHistory"
        AutoGenerateColumns="False"
        IsReadOnly="True"
        HeadersVisibility="Column"
        GridLinesVisibility="None"
        CanUserSortColumns="False"
        Style="{StaticResource MapTimerDataGrid}"
        CellStyle="{StaticResource MapTimerControlCell}"
        ItemsSource="{Binding Plan.Plan}">
    <DataGrid.Resources>
<!-- The Binding in CurrentMapName is not valid. It says it can only be set on a dependency property but I'm not sure how to do that -->
        <conv:RaceMapColorConverter x:Key="MapColorConverter" CurrentMapName="{Binding CurrentMap.MapName}" CurrentMapColor="Red" OtherMapColor="White" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Map" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Label Content="{Binding Map.MapName}" Foreground="{Binding Map.MapName, Converter={StaticResource MapColorConverter}}" Padding="0" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- Other columns removed to shorten -->
    </DataGrid.Columns>
</DataGrid>
XAML:

public class StringToBrushConverter : IValueConverter
{
    public string CurrentMapName { get; set; }
    public Color CurrentMapColor { get; set; }
    public Color OtherMapColor { get; set; }

    string _value = "";

    public StringToBrushConverter(string currentMapName, Color currentMapColor, Color otherMapColor)
    {
        CurrentMapName = currentMapName;
        CurrentMapColor = currentMapColor;
        OtherMapColor = otherMapColor;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        _value = value as string;
        return (string)value == CurrentMapName ? new SolidColorBrush(CurrentMapColor) : new SolidColorBrush(OtherMapColor);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return _value; //TODO: Will this work?
    }
}

public sealed class RaceMapColorConverter : StringToBrushConverter
{
    public RaceMapColorConverter() : base("", new Color { R = 255, G = 0, B = 0 }, new Color { R = 255, G = 255, B = 255 }) { }
}
<DataGrid x:Name="MapHistory"
        AutoGenerateColumns="False"
        IsReadOnly="True"
        HeadersVisibility="Column"
        GridLinesVisibility="None"
        CanUserSortColumns="False"
        Style="{StaticResource MapTimerDataGrid}"
        CellStyle="{StaticResource MapTimerControlCell}"
        ItemsSource="{Binding Plan.Plan}">
    <DataGrid.Resources>
<!-- The Binding in CurrentMapName is not valid. It says it can only be set on a dependency property but I'm not sure how to do that -->
        <conv:RaceMapColorConverter x:Key="MapColorConverter" CurrentMapName="{Binding CurrentMap.MapName}" CurrentMapColor="Red" OtherMapColor="White" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Map" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Label Content="{Binding Map.MapName}" Foreground="{Binding Map.MapName, Converter={StaticResource MapColorConverter}}" Padding="0" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- Other columns removed to shorten -->
    </DataGrid.Columns>
</DataGrid>


我也不知道如何实现“ConvertBack()”。将原始值存储在转换器中是否有效?或者可以为同一控件创建新实例吗?我这样做对吗?我想值得一提的是,我正在使用Caliburn.Micro,以防它有任何可能有用的技巧。如果您需要任何帮助,我们将不胜感激。

一般经验法则是,当数据转换需要双向(即查看模型以查看并再次返回)时,您应该使用转换器;当数据转换需要单向时,您应该使用数据触发器。这就回答了您关于ConvertBack的问题(在您提供的示例中,无论如何都不会调用ConvertBack,在这种情况下,您可以返回Binding.DoNothing)

然而,在这种特殊情况下,转换器是有保证的,因为您需要比较两个绑定。与其为这项非常具体的任务编写一个应用程序感知转换器,不如选择一个更通用的多转换器,它只比较您提供的两个值:

public class EqualityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return (values.Length==2) && Object.Equals(values[0], values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return new object[] { Binding.DoNothing, Binding.DoNothing };
    }
}
然后回到应用程序中,将两个绑定传递到该类型的多重绑定中,并在比较结果为真时使用DataTrigger更改映射颜色:

<Label Content="{Binding Map.MapName}">
    <Label.Style>
        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type Label}}">
            <Setter Property="Foreground" Value="Red" /> <!-- normal map color -->
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource EqualityConverter}" Mode="OneWay">
                            <Binding Path="Map.MapName" />
                            <Binding Path="CurrentMapName" />
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Foreground" Value="White" /> <!-- other map color -->
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
</Label>

您真的需要
ConvertBack
在这里将画笔转换为地图名称吗?方法告诉您在这种情况下使用
dependencProperty.UnsetValue
Binding.DoNothing