好的,正如我所说,我有一个ListBox中的ComboBox。这些都是控件(在Visual Studio 2010和MVVM中使用C#的WPF项目)。
我可以很好地创造它们。
ListBox包含一个名为IntWrapper的ObservableCollection,它只包含int和int。
ComboBox加载了一个名为MissionViewModel的ObservableCollection,它只是一个包含一些基本数据类型的类。
因此ListBox和ComboBox的ItemSource是不同的。
我可以使用按钮向ListBox添加项目,只需向ObservableCollection添加一个新的IntWrapper。在视觉上这给了我一个新的ComboBox,它被填充。
我无法弄清楚当我选择它时,如何让MissionViewModel的一个属性转到IntWrapper中的属性。
以前我只是在ListBox中使用了一个TextBox,它看起来像这样:
<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="1">Mission ID: </TextBlock>
<TextBox Margin="1" Text="{Binding Int, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我的(非工作)尝试,我用ComboBox替换TextBox是这样的:
<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
<StackPanel Orientation="Horizontal">
<ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}"></ComboBox>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我原以为SelectedValuePath会是我想要的东西,但到目前为止这似乎不起作用(也许我的用法不正确)。
任何帮助都将不胜感激。
答案 0 :(得分:1)
将SelectedValue
的{{1}}属性绑定到ComboBox
的{{1}}属性:
Int
如果IntWrapper
属性具有公共setter并且<ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" SelectedValue="{Binding Int}"
ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}" />
的{{1}}属性与IntWrapper.Int
属性的类型相同,则此方法应该有效Int
。
答案 1 :(得分:0)
我尝试根据您的描述为您的问题创建解决方案。为了帮助您获得更多资格,我们需要有关MissionViewModel及其中包含的属性的更多信息。
我想,你的Binding并没有指向正确的ViewModel。我尝试重新创建下面描述的内容,在我的例子中,组合框中填充了MissionVm类的Name属性。
这是XAML。在这里,我将ItemsSource Binding更改为直接指向父窗口的DataContext的ObservableCollection。
<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding }"></TextBlock>
<ComboBox Margin="20" Width="50" ItemsSource="{Binding DataContext.MissionVMs, RelativeSource={RelativeSource AncestorType=Window}}" DisplayMemberPath="Name"></ComboBox>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是基于您的描述的ViewModel:
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
var vm1 = new MissionVM { Id = 1, Name = "111"};
var vm2 = new MissionVM { Id = 2, Name = "222" };
var vm3 = new MissionVM { Id = 3, Name = "333" };
MissionVMs = new ObservableCollection<MissionVM> { vm1, vm2, vm3};
MissionsToGive = new ObservableCollection<int> {1, 2, 3};
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public ObservableCollection<int> MissionsToGive { get; set; }
public int SelectedMissionToGive { get; set; }
public ObservableCollection<MissionVM> MissionVMs { get; set; }
}
public class MissionVM
{
public int Id { get; set; }
public string Name { get; set; }
}
这是输出:
我希望这会有所帮助。如果我误解了你,请进一步解释这个问题。