Мне нужно получить значения из моих ComboBox
es, которые находятся в ObservableCollection
, итерации через ItemsControl
. И мне нужно хранить их в отдельной структуре данных, по крайней мере, я думаю, что знаю. Звучит довольно просто? Надеюсь, я все время застрял на нем.Элемент доступа WPF MVVM внутри ItemsControl DataTemplate
Вот мой XAML:
<Window.Resources>
<Style x:Key="IVCell" TargetType="{x:Type ItemsControl}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Variable.Name}"/>
<ComboBox x:Name="IVValues" ItemsSource="{Binding Values}"
SelectedIndex="0"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
...
<ItemsControl Name="IndependentVariables" Style="{StaticResource IVCell}" ItemsSource="{Binding IVCollection}"/>
где IVCollection
определяется здесь, в моем ViewModel:
public class MainViewModel : ViewModelBase
{
public ObservableCollection<ExternalClass> IVCollection { get; set; }
...
}
Прежде чем спросить, что ExternalClass
это, знайте, что это то, что содержит Variable
и Values
.
В этом проблема. Мне нужно получить SelectedIndex
ComboBox
(так что я бы изменил текущий код SelectedIndex="0"
). И если мои ExternalClass
были такими, которые должны были содержать эти значения SelectedIndex
, это было бы легко, так как у меня уже есть доступ к его полям (Variable
и Value
). Но мне нужны эти int
значения в
public class MainViewModel : ViewModelBase
{
public ObservableCollection<int> SelectedIndices { get; set; }
...
}
или что-то в этом роде. Я сделал быстрый класс обертки, содержащий как SelectedIndices
, так и IVCollection
, но, очевидно, это не сработает, потому что ItemsControl
хочет ObservableCollection
, а не класс с двумя ObservableCollection
.
И я думаю, что настоящее мясо вопроса здесь (я мог ошибаться, вот почему я спрашиваю), как я могу получить доступ к объекту, находящемуся за пределами области Style
/DataTemplate
Я сейчас в (например IVCell
)? Я могу сделать это в коде-за без проблем, как это так,
private void IVValues_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
for (var i = 0; i < IndependentVariables.Items.Count; i++)
{
var uiElement = IndependentVariables.ItemContainerGenerator.ContainerFromIndex(i);
var cBox = FindVisualChild<ComboBox>(uiElement); //Homebrew method
//cBox.SelectedIndex
}
}
но еще раз, я пытаюсь остаться MVVM дружелюбным. Я даже пытался использовать команды событий с MVVM Light и т. Д., Но это просто откладывает проблему. Мне нужно это решить. Или обойти его.
Так что, если вам удастся связать выбранные значения индекса каждого ComboBox к вам SelectedIndices коллекции, как вы будете отслеживать, какие значения из какой ComboBox/ExternalClass ? Похоже, что длина элементов в IVCollection фиксирована, и поэтому вы намерены использовать индекс значения в SelectedIndices, но я не совсем понятен. –
Вам нужно другое свойство или два в «ExternalClass» для привязки к SelctedItem и/или SelectedIndex ComboBox, чтобы отслеживать, какие элементы выбраны. –