我有一个WPF MVVM应用程序。我试图公开一个名为Targets的可映射对象列表。应用程序启动后会填充目标。并通过设置为TargetFilter UserControl数据上下文的viewModel公开。 在我的TargetFilter控件中,我想要一个列表框来公开一个名为ShowOnMap的bool属性。我能够通过字典暴露数据,但这是笨重的,并不是一个非常好的方法来关闭目标。此外,它是hacky并且打破了MVVM的所有数据绑定。
public class Target
{
public int Index { get; set; }
public int TargetId { get; set; }
public TargetLocation lastLocation { get; set; }
//LastLocation contains lat long etc.
public string Name { get; set}
public bool ShowOnMap { get; set; }
}
在我的用户会话对象上我有一个ObservableCollection:
public ObservableCollection<Target> TargetCache;
我有用于公开此数据的视图模型
public class MapViewModel : ViewModelBase
{
private ServerSession _serverSession;
public ObservableCollection<Target> GetTargetCache
{
get
{
//if (_serverSession.User.TargetCache != null)
//{
return _serverSession.User.TargetCache;
//}
//return new ObservableCollection<Target>();
}
set
{
_serverSession.User.TargetCache = value;
}
}
// key value pari of TargetID, TargetName
public Dictionary<string, string> GetAllTargetDictionary
{
get
{
return _serverSession.User.AllTargetDictionary;
}
}
// more code
}
此视图模型附加到具有多个子用户控件的设置用户控件
public partial class Settings : UserControl
{
private MapViewModel _mapViewModel;
public event EventHandler DismissRequested;
public Settings()
{
InitializeComponent();
}
public Settings(MapViewModel mapViewModel)
{
InitializeComponent();
_mapViewModel = mapViewModel;
TargetFilter targetFilter = new TargetFilter(_mapViewModel.ServerSession);
targetFilter.DataContext = _mapViewModel;
targetFilter.DismissRequestedTargetList += new EventHandler(HandleEventHideUserControl);
TargetFilterTab.Content = targetFilter;
我的Xaml正在尝试显示一个组合框和一个目标复选框列表。
我的组合框工作,我绑定到字典,但我无法绑定到列表:
<StackPanel Grid.Row="0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Targets" FontWeight="Bold" />
<Label Grid.Column="1" Name="TargetList" HorizontalContentAlignment="Right" />
</Grid>
<TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="14" Margin="15,0,10,0">Select Case</TextBlock>
<Separator Margin="10" />
<ComboBox Grid.Column="1" ItemsSource="{Binding Path=GetCaseDictionary}"
DisplayMemberPath="Value" SelectedValuePath="key"
SelectedValue="{Binding Path=selectCase}" SelectionChanged="ComboBox_SelectionChanged" Name="CaseDropDown" />
<TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="14" Margin="15,0,10,0">Dispaly Targets bind on dictionary</TextBlock>
<Separator Margin="10" />
<ListBox ItemsSource="{Binding Path=GetAllTargetDictionary}">
<ListBox.ItemTemplate>
<DataTemplate>
<!--<CheckBox IsChecked="{Binding ShowOnMap, Mode = TwoWay}" Click="CheckBox_Click" Name="value" >
</CheckBox>-->
<CheckBox Content="{Binding Value}"
IsChecked="{Binding Path=Key, Mode=OneWay}" Click="CheckBox_Click"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="14" Margin="15,0,10,0">Display Targets bind on Target Cache</TextBlock>
<Separator Margin="10" />
<ListBox ItemsSource="{Binding Path=GetTargetCache}" Name="lbTargets">
<ListBox.ItemTemplate>
<DataTemplate>
<!--<CheckBox IsChecked="{Binding ShowOnMap, Mode = TwoWay}" Click="CheckBox_Click" Name="value" >
</CheckBox>-->
<CheckBox Content="{Binding Name}"
IsChecked="{Binding ShowOnMap}" Click="CheckBox_Click"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
这是指向最终列表框中没有绑定的内容的链接 http://imgur.com/Wr4LO1B
绑定时不存在任何数据,稍后创建和访问。为什么绑定适用于字典但不适用于列表?任何让我的列表绑定的想法?
谢谢
答案 0 :(得分:0)
我没有在viewmodels GetTargetCache
属性的setter上看到任何更改通知。我认为您的应用程序不会在运行时获取属性的更改/分配。
您是否有方法在您可以调用的基类INotifyPropertyChanged
中提出更改通知(ViewModelBase
)?
通常它就像
OnPropertyChanged("GetTargetCache")
此外,您确定第一个列表框的绑定是否正确?
我可以看到第一个ListBox
在视图模型上使用GetAllTargetDictionary
属性,类型为Dictionary<string, string>
。
这意味着这个绑定
IsChecked="{Binding Path=Key, Mode=OneWay}"
是指字典的键,它是一个字符串。
但是ÌsChecked
是一个布尔......
您是否在运行时查看了调试窗口?在那里搜索绑定错误消息。
另外我想建议删除&#34; Get&#34;你的属性上的前缀,听起来像一个方法。