我需要从我的ComboBox
es 中获取值,这些值驻留ObservableCollection
在ItemsControl
. 而且我需要将它们存储在一个单独的数据结构中,至少我认为是这样。听起来很简单?我希望是这样,我整天都在坚持。
这是我的 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}"/>
where 在IVCollection
这里定义,在我的 ViewModel 中:
public class MainViewModel : ViewModelBase
{
public ObservableCollection<ExternalClass> IVCollection { get; set; }
...
}
在你问是什么之前ExternalClass
,要知道那是包含Variable
和的东西Values
。
这就是问题所在。我需要得到SelectedIndex
of ComboBox
(所以我会改变当前的代码SelectedIndex="0"
)。如果我ExternalClass
需要包含这些SelectedIndex
值,那将很容易,因为我已经可以访问它的字段(Variable
和Value
)。但我需要这些int
价值观
public class MainViewModel : ViewModelBase
{
public ObservableCollection<int> SelectedIndices { get; set; }
...
}
或类似的东西。我已经制作了一个快速包装类来同时包含SelectedIndices
and IVCollection
,但显然这不起作用,因为ItemsControl
想要一个ObservableCollection
,而不是一个有两个ObservableCollection
s 的类。
而且我想这里问题的真正实质(我可能是错的,这就是我要问的原因)是我如何访问我当前所在的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 等一起使用,但这只是推迟了问题。我需要解决它。或者绕过它。