将对象列表中的布尔属性公开给WPF复选框

时间:2015-07-02 01:55:17

标签: c# wpf list checkbox data-binding

我有一个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>

这是指向最终列表框中没有绑定的内容的链接 tab control image http://imgur.com/Wr4LO1B

绑定时不存在任何数据,稍后创建和访问。为什么绑定适用于字典但不适用于列表?任何让我的列表绑定的想法?

谢谢

1 个答案:

答案 0 :(得分:0)

我没有在viewmodels GetTargetCache属性的setter上看到任何更改通知。我认为您的应用程序不会在运行时获取属性的更改/分配。 您是否有方法在您可以调用的基类INotifyPropertyChanged中提出更改通知(ViewModelBase)? 通常它就像

OnPropertyChanged("GetTargetCache")


此外,您确定第一个列表框的绑定是否正确? 我可以看到第一个ListBox在视图模型上使用GetAllTargetDictionary属性,类型为Dictionary<string, string>。 这意味着这个绑定

 IsChecked="{Binding Path=Key, Mode=OneWay}"

是指字典的键,它是一个字符串。

但是ÌsChecked是一个布尔......

您是否在运行时查看了调试窗口?在那里搜索绑定错误消息。


另外我想建议删除&#34; Get&#34;你的属性上的前缀,听起来像一个方法。