Извините, но вы делаете это неправильно.
Весь ваш пост на форуме пахнет одним кодом за другим.
1. Вы используете преобразователи значений для преобразования бизнес-объекта в его визуальный аналог. Это кодовый запах в моей книге.
2. Вы пытаетесь отправить элемент управления пользовательского интерфейса в бизнес-логику.
3. Честно говоря, кто-то здесь сказал «MultiBindings» (и не только потому, что он прав), моя голова взорвалась, и теперь там, где раньше был мой мозг, образовалась черная дыра небытия.
Чтобы узнать больше о моих религиозных убеждениях в отношении преобразователей значений, триггеров, мультисвязей и других наихудших практик для разработки реальных LOB - см. Следующую ветку на WPF Disciples .
Однако давайте сосредоточимся на том, чтобы вас распутать.
Вам нужен - ViewModel .
Вот что вам нужно поместить в эту ViewModel:
1. Элементы управления не привязываются друг к другу. Это мерзость невиданная с библейских времен. Всякий раз, когда что-то меняется в элементе управления (ComboBox.SelectedItem, TextBox.Text и т. Д.), Связывайте это непосредственно с ViewModel. Таким образом, вместо привязки к PlaneSelector.SelectedItem и PlaneSelector.SelectedItem.VisibleElements привяжите selectedItem обратно к ViewModel.
2. Преобразование между вашими бизнес-данными и соответствующим визуальным представлением в ViewModel. Итак, пусть модель представления возвращает геометрические данные.
Вот черновик того, как выглядит супер простая модель ViewModel:
public class myFormViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void InvokePropertyChanged(string propertyName)
{
PropertyChangedEventHandler changed = PropertyChanged;
if (changed != null) changed(this, new PropertyChangedEventArgs(propertyName));
}
private object _planeSelectedItem;
public object PlaneSelectedItem
{
get { return _planeSelectedItem; }
set
{
_planeSelectedItem = value;
InvokePropertyChanged("PlaneSelectedItem");
}
}
public IEnumerable<KeyValuePair<string, Geometry>> VisibleElements
{
get
{
foreach(var slenderMember in PlaneSelectedItem.VisibleElements)
{
yield return new KeyValuePair<string, Geometry>(slenderMember.AsString, ToGeometry(slenderMember));
}
}
}
}
И вот как примерно должна выглядеть эта часть вашего контроля:
<ComboBox SelectedItem="{Binding PlaneSelectedItem, Mode=TwoWay}" />
<ItemsControl x:Name="Display"
Background="White"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ItemsSource="{Binding VisibleElements}">
<ItemsControl.ItemTemplate>
<DataTemplate >
<Path Stroke="Blue" StrokeThickness=".5"
Data="{Binding Value}" ToolTip="{Binding Key}">
</Path>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Очевидно, здесь есть некоторый пропущенный код (установка this.DataContent = new myFormViewModel (), использование KeyValuePairs, установка ComboBox ItemsSource и т. Д.). Но суть здесь в том, чтобы упростить эти сумасшедшие обязательные махинации.
Вместо попытки взломать XAML, чтобы он вел себя как код - просто используйте код.
Это сделает вашу жизнь намного проще.