Переменная Data привязка Стили ячеек WPF - Объект внутри объекта - PullRequest
0 голосов
/ 13 декабря 2018

Проблема, с которой я сейчас сталкиваюсь, заключается в создании стиля ячейки, который можно применять к каждому столбцу, но с использованием другой переменной.

В настоящее время мне приходится повторять код стиля и изменять одну переменную, как показано ниже.:

XAML:

<DataGridTextColumn Header="CR Implement" Binding="{Binding CRIMPLEMENTATION.End_Date, StringFormat=dd-MM-yyyy}" HeaderStyle="{StaticResource CenterGridHeaderStyle}"  Width= "90" >
                    <DataGridTextColumn.CellStyle >
                        <Style TargetType="{x:Type DataGridCell}">
                            <Setter Property="TextBlock.TextAlignment" Value="Center" />
                            <Setter Property="TextBlock.FontSize" Value="16" />
                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                            <Setter Property="ToolTip" Value="{Binding CRIMPLEMENTATION.StatusInfo}" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding CRIMPLEMENTATION.MultiBooking}" Value="True">
                                    <Setter Property="BorderBrush" Value="Black" />
                                    <Setter Property="BorderThickness" Value="1.5" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding CRIMPLEMENTATION.status}" Value="1">
                                    <Setter Property="Background" Value="LimeGreen" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding CRIMPLEMENTATION.status}" Value="2">
                                    <Setter Property="Background" Value="Yellow" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding CRIMPLEMENTATION.status}" Value="3">
                                    <Setter Property="Background" Value="Orange" />
                                </DataTrigger>
                                <MultiDataTrigger>
                                    <MultiDataTrigger.Conditions>
                                        <Condition Binding="{Binding CRIMPLEMENTATION.isLateValue}" Value="1" />
                                        <Condition Binding="{Binding CRIMPLEMENTATION.status}" Value="0" />
                                    </MultiDataTrigger.Conditions>
                                    <Setter Property="Background" Value="Red" />
                                </MultiDataTrigger>
                                <MultiDataTrigger>
                                    <MultiDataTrigger.Conditions>
                                        <Condition Binding="{Binding CRIMPLEMENTATION.isLateValue}" Value="0" />
                                        <Condition Binding="{Binding CRIMPLEMENTATION.status}" Value="0" />
                                    </MultiDataTrigger.Conditions>
                                    <Setter Property="Background" Value="White" />
                                </MultiDataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.CellStyle>

Этот XAML в настоящее время повторяется 30 раз для каждого отдельного столбца.

Единственная изменчивость в каждом стиле ячейки иТекстовый столбец сетки данных: имя переменной.

Ниже приведены фрагменты кода, чтобы дать более четкое представление о том, как настраиваются классы.

C # Class:

  public class Job
{
    public string JobDescription { get; set; }

    public int JobID { get; set; }

    public Dictionary<String, List<Booking>> MyBookings = new Dictionary<String, List<Booking>>();

    public Dictionary<String, List<String>> Emails = new Dictionary<string, List<string>>();
    public Booking MilestoneCRBriefAvailable { get; set; }
    public Booking MilestoneCRQuoted { get; set; }
    public Booking MilestoneCRQuoteApproved { get; set; }
}

C # Class :

  public class Booking
{

    public int isLateValue { get; set; } = 0;
    public string StatusInfo { get; set; }
    public string Counter { get; set; }
    public int BKGID { get; set; }
    public int JobID { get; set; }
    public int UserID { get; set; }
    public int CMPID { get; set; }
    public DateTime? Start_Date { get; set; }
    public DateTime? End_Date { get; set; }
    public string Notes { get; set; }
    public int status { get; set; }
}

Идеальным сценарием было бы изменение жестко закодированной переменной в примере

CRIMPLEMENTATION.end_date 

На

****.end_date

Любые предложения будут очень полезны.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете связать значение источника данных.

С рук Я не могу представить, как вы могли бы сделать это элегантно с помощью конвертера.Вы можете передать индекс столбца, но он будет очень хрупким.

Как я иногда делаю «неуклюжие» вещи, подобные этой, это динамически собирать столбцы с помощью xamlreader.parse.Я строю строку, которая является разметкой базового столбца.Затем я изменяю это (в строке) и разбираю его в столбец, который добавляю в сетку данных.

Вместо того, чтобы разбирать ваш код на части, я покажу вам некоторые из них, которые я могу просто вставить.

Я хочу, чтобы перечисление управляло столбцами (и строками), для которых у меня есть пользовательские значения редактирования.Фактически это соотношение «сила против красного» и «сила» синего и значения атаки для красной пехоты против красной пехоты, красной пехоты против синей легкой пехоты и т. Д.

Таким образом, существует две матрицы атак и пользовательский контроль, используемые дважды.Я строю столбцы:

public partial class AttackMatrixView : UserControl
{
    public Sides AttackingSide = Sides.Red;
    public Sides DefendingSide = Sides.Blue;
    public AttackMatrixView()
    {
        Resources.Add("AttackerSide", AttackingSide);
        Resources.Add("DefenderSide", DefendingSide);
        InitializeComponent();
        XElement col = GetXElement(@"pack://application:,,,/Views/AttackFactors/attackFactorColumn.txt");
        foreach (UnitTypes ut in  Enum.GetValues(typeof(UnitTypes)).Cast<UnitTypes>().Where(x=>x.ThisFights()==true).Select(x=>x).ToList())
        {
            XElement el = new XElement(col);
            string colString = el.ToString()
                .Replace("^^^Index^^^", ((int)ut).ToString())
                .Replace("^^^EnumString^^^", ut.ToString())
                .Replace("^^^EnumDescription^^^", ut.ToDescriptionString());
            ParserContext context = new ParserContext();
            context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
            context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
            DataGridTextColumn tc = (DataGridTextColumn)XamlReader.Parse(colString, context);
            dg.Columns.Add(tc);
        };

    }
    private XElement GetXElement(string uri)
    {
        XDocument xmlDoc = new XDocument();
        var xmltxt = Application.GetContentStream(new Uri(uri));
        string elfull = new StreamReader(xmltxt.Stream).ReadToEnd();
        xmlDoc = XDocument.Parse(elfull);
        return xmlDoc.Root;
    }
}

Это использует текстовый файл:

<?xml version="1.0" encoding="utf-8" ?>
<DataGridTextColumn Binding="{Binding Factor[^^^Index^^^], Mode=TwoWay,      UpdateSourceTrigger=PropertyChanged}" Width="*"  
xmlns:ui="clr-namespace:UILib;assembly=UILib"
xmlns:local="clr-namespace:ScenarioEditor"
xmlns:model="clr-namespace:ModelLib;assembly=ModelLib"
>
 <DataGridTextColumn.HeaderTemplate>
     <DataTemplate>
         <ui:IconParent Height="20" Width="30" 
                 ui:IconParent.IPType="{x:Static model:UnitTypes.^^^EnumString^^^}"
                 ui:Icon.UnitType="{x:Static model:UnitTypes.^^^EnumString^^^}"
                 ui:Icon.Side="{Binding DataContext.DefenderSide
                    , RelativeSource={RelativeSource AncestorType=UserControl}}"
                >
            <ui:IconParent.ToolTip>
                <ToolTip>
                    ^^^EnumDescription^^^
                </ToolTip>
            </ui:IconParent.ToolTip>
                <ui:UnitIcon Margin="2"/>
        </ui:IconParent>
    </DataTemplate>
</DataGridTextColumn.HeaderTemplate>

Вы можете иметь что-то подобное и манипулировать значением для datatrigger, что связано и т.д.и т. д.

Просто для наглядности - законченный вид с двумя экземплярами матрицы атаки: enter image description here

...