【问题标题】:Problem with Silverlight ComboBoxItem bindingSilverlight ComboBoxItem 绑定问题
【发布时间】:2011-07-19 23:39:44
【问题描述】:

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

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; }
    }
}

我在这里做错了什么? 提前谢谢。

【问题讨论】:

  • 肯定还有其他一些细节遗漏,因为我根本无法重现您的错误。您能否提供 DB_Aux_Pessoas 的代码,并且当您说“不反映属性”时,您能否准确地告诉我们您是如何寻找这种变化的?谢谢。
  • 嗨,马丁,我已经用 DB_Aux_Pessoas 的代码编辑了问题。问题是我有一个ComboBox,它的ItemsSource是一个SelectionItem的集合,而属性IsSelected是绑定到ComboBox的ItemTemplate的一个CheckBox上的。当我检查 CheckBox 并读取 ItemsSource 的值时,属性 IsSelected 没有更改值。

标签: silverlight binding combobox


【解决方案1】:

我现在不能检查这个,但我相当确定依赖属性IsChecked 将只接受绑定到bool 而不是Nullable&lt;bool&gt;。您可能必须在视图模型中进行转换并决定哪个应该是空值的适当默认值。

【讨论】:

  • 它的行为方式与“bool”而不是“bool?”相同。
【解决方案2】:

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

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>

如果您在单击复选框时看到“是”、“否”、“空”发生变化,那么它正在工作。你的代码对我有用。

【讨论】:

  • 如果有效,文本框会在我检查复选框时更改值。问题在于它不会更改作为 ComboBox 的 ItemsSource 的集合。我认为它会创建数据的新“副本”,并且不会反映对原始集合的更改。
  • 是的,我有一种感觉,负责设置/获取集合的任何人都在重写集合或制作副本。您的绑定工作正常。没有必要改变它。
【解决方案3】:
 public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(...),
    new PropertyMetadata(false, delegate(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
     ...
    }

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

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2011-09-12
    相关资源
    最近更新 更多