Silverlight ComboBoxItem绑定问题

时间:2011-03-21 20:25:13

标签: silverlight binding combobox

我只是无法使以下情况起作用: 我有一个类,具有以下实现:

public class SelectionItem<T> : ViewModelBase where T : Entity
{
    private bool? _isSelected;
    public bool? IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            RaisePropertyChanged("IsSelected");
        }
    }

    public T Item { get; set; }
}

我的ViewModel上有以下属性:

    private IEnumerable<SelectionItem<DB_Aux_Pessoas>> _vendedores;
    public IEnumerable<SelectionItem<DB_Aux_Pessoas>> Vendedores
    {
        get
        {
            return _vendedores;
        }
        set
        {
            _vendedores = value;
            RaisePropertyChanged("Vendedores");
        }
    }

然后,在我的视图中,我有ComboBox:

                    <ComboBox Margin="3,0,0,0"
                              Height="23"
                              Width="200"
                              ItemsSource="{Binding Vendedores, Mode=TwoWay}"
                              Grid.Column="1"
                              Grid.Row="1"
                              HorizontalAlignment="Left">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                                    <TextBlock Text="{Binding Item.NomeRazaoSocial}" />
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>

但是当我更改ComboBoxItem上的CheckBox时,它不反映在属性上。

DB_Aux_Pessoas的代码如下:

[MetadataTypeAttribute(typeof(DB_Aux_Pessoas.DB_Aux_PessoasMetadata))]
public partial class DB_Aux_Pessoas
{

    // This class allows you to attach custom attributes to properties
    // of the DB_Aux_Pessoas class.
    //
    // For example, the following marks the Xyz property as a
    // required property and specifies the format for valid values:
    //    [Required]
    //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
    //    [StringLength(32)]
    //    public string Xyz { get; set; }
    internal sealed class DB_Aux_PessoasMetadata
    {

        // Metadata classes are not meant to be instantiated.
        private DB_Aux_PessoasMetadata()
        {
        }

        public Nullable<short> Cliente { get; set; }

        public string Id_Numero { get; set; }

        public string NomeRazaoSocial { get; set; }

        public Nullable<short> Supervisor { get; set; }

        public Nullable<short> Vendedor { get; set; }
    }
}

我在这里做错了什么? 请事先提前。

3 个答案:

答案 0 :(得分:0)

我现在无法检查,但我很确定依赖属性IsChecked只接受绑定到bool而不是Nullable<bool>。您可能必须在viewmodel中进行转换,并确定哪个应该是空值的适当默认值。

答案 1 :(得分:0)

这对我来说很好。添加一个额外的属性,为您提供这样的视觉反馈:

public class SelectionItem<T> : ViewModelBase
{
    private bool? _isSelected;
    public bool? IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            RaisePropertyChanged("IsSelected");
            RaisePropertyChanged("Feedback");
        }
    }

    public string Feedback
    {
        get
        {
            if (!this.IsSelected.HasValue)
            {
                return "null";
            }

            if (this.IsSelected.Value)
            {
                return "yes";
            }

            return "no";
        }
    }


    public T Item { get; set; }
}

在你的xaml中,添加一个额外的TextBlock来显示结果:

<ComboBox Grid.Column="1"
                  Grid.Row="1"
                  Height="23"
                  Margin="3,0,0,0"
                  Width="200"
                  HorizontalAlignment="Left"
                  ItemsSource="{Binding Vendedores, Mode=TwoWay}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                        <TextBlock Text="{Binding Item.NomeRazaoSocial}" />
                        <TextBlock Text="{Binding Feedback}" Margin="5,0,0,0" />
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

如果您在单击复选框时看到“是”,“否”,“空”更改,则表明它正在运行。你的代码对我有用。

答案 2 :(得分:0)

 public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(...),
    new PropertyMetadata(false, delegate(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
     ...
    }

IsCheckedbool。您可以在“输出”窗口中跟踪BindingExpression错误。