Вы не можете связать значение источника данных.
С рук Я не могу представить, как вы могли бы сделать это элегантно с помощью конвертера.Вы можете передать индекс столбца, но он будет очень хрупким.
Как я иногда делаю «неуклюжие» вещи, подобные этой, это динамически собирать столбцы с помощью 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, что связано и т.д.и т. д.
Просто для наглядности - законченный вид с двумя экземплярами матрицы атаки: