0

我一直在使用这样的代码

<ComboBox ItemsSource="{Binding Path=CompaniesViewModel.CompaniesCollection}"                              
    SelectedValuePath="CompanyId"
    SelectedValue="{Binding Path=CompanyId}"
    IsEnabled="False"
    DisplayMemberPath="CompanyName"      
    />

在组合框中显示公司名称。注意 IsEnabled 是如何设置为 false 的……那是因为我真的不希望用户使用 ComboBox。我只是将它用作将 ID 转换为字符串以进行显示的简单方法。

当我将项目放在一个网格中并且它们很多时,我认为这真的会损害渲染性能。当我删除 ComboBox 时,它会在瞬间加载。在代码中使用 ComboBox 时,可能需要 20 秒。

我想我的问题是我认为我应该使用 Label 或 TextBlock,但不确定如何使绑定正常工作,因为它们没有 ItemsSource 或 SelectedValuePath 或 SelectedValue。

我想写一个 IValueConverter 但不确定如何绑定/传递 3 个值。我必须传入集合、ValuePath 和 Value ID。

有什么想法或建议吗?

4

3 回答 3

1

放一个

public Company Company {get {return CompaniesCollection.FirstOrDefault(x => x.CompanyId == CompanyId); }}

ViewModel 中的属性。

于 2013-06-07T22:06:16.343 回答
0

我猜你的组合框加载时间太长,因为你的收藏有很多项目。

如果您只展示其中一个公司,那么您不应该加载所有公司,作为一般的良好做法。

我不太了解您使用组合框的意图。是风格吗?将来可以启用吗?如果这只是显示 CompanyName 的一种简单方法,那么我建议如下:

  1. 直接绑定到 CompanyName 属性。

-或者-

  1. 在代码隐藏中,创建一个名为“CompanyDisplayName”的计算属性,用于获取您的公司名称。
  2. 在 XAML 中绑定到它
  3. 在代码隐藏中,每当当前选择的 Company 实例或 CompanyId 更改时,触发 'OnPropertyChanged("CompanyDisplayName")

尝试使用 TextBlock 或只读 TextBox 来启用复制/粘贴;

有关 NotifyPropertyCahnged 范例的更多信息,请阅读此处

于 2013-06-08T00:05:12.823 回答
0

我欢迎你们中的任何人检查我的代码,看看你是否可以让它更有效率,但这就是我最终要做的。

<cc:LookupLabel  
    ItemsSource="{Binding Path=CompaniesCollection}"                              
    SelectedValuePath="CompanyId"
    SelectedValue="{Binding Path=CompanyId}"                                
    DisplayMemberPath="CompanyName"      
    />

下面是从 Label 和 INotifyPropertyChanged 派生的 LookupLabel。我不确定微软如何有效地实现这一点,但这是我最好的尝试。特别是底部列出的 GetContent 方法。所有其他的东西只是凌乱的 DependencyProperty 声明。

using System;
using System.Collections;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace CustomControls
{
    public class LookupLabel : Label, INotifyPropertyChanged
    {

        public LookupLabel()
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }       

        #region ItemsSource

        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(LookupLabel)
                , new UIPropertyMetadata(null, LookupLabel.ItemsSourceChanged)
                );

        private static void ItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LookupLabel t = d as LookupLabel;            
            t.NotifyPropertyChanged("ItemsSource");
            t.Content = GetContent(t);
        }

        [Bindable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public IEnumerable ItemsSource
        {
            get
            {
                return (IEnumerable)GetValue(ItemsSourceProperty);
            }
            set
            {
                SetValue(ItemsSourceProperty, value);
            }
        }
        #endregion ItemsSource

        #region SelectedValue

        public static readonly DependencyProperty SelectedValueProperty =
            DependencyProperty.Register("SelectedValue", typeof(object), typeof(LookupLabel)
                , new UIPropertyMetadata(null, LookupLabel.SelectedValueChanged)
                );

        private static void SelectedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LookupLabel t = d as LookupLabel;
            t.NotifyPropertyChanged("SelectedValue");
            t.Content = GetContent(t);
        }

        [Localizability(LocalizationCategory.NeverLocalize)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Bindable(true)]
        [Category("Appearance")]
        public object SelectedValue
        {
            get
            {
                return (object)GetValue(SelectedValueProperty);
            }
            set
            {
                SetValue(SelectedValueProperty, value);
            }
        }
        #endregion SelectedValue

        #region SelectedValuePath

        public static readonly DependencyProperty SelectedValuePathProperty =
            DependencyProperty.Register("SelectedValuePath", typeof(string), typeof(LookupLabel)
                , new UIPropertyMetadata(string.Empty, LookupLabel.SelectedValuePathChanged)
                );

        private static void SelectedValuePathChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LookupLabel t = d as LookupLabel;
            t.NotifyPropertyChanged("SelectedValuePath");
            t.Content = GetContent(t);
        }

        [Localizability(LocalizationCategory.NeverLocalize)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Bindable(true)]
        [Category("Appearance")]
        public string SelectedValuePath
        {
            get
            {
                return (string)GetValue(SelectedValuePathProperty);
            }
            set
            {
                SetValue(SelectedValuePathProperty, value);
            }
        }
        #endregion SelectedValuePath

        #region DisplayMemberPath

        public static readonly DependencyProperty DisplayMemberPathProperty =
            DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(LookupLabel)
                , new UIPropertyMetadata(string.Empty, LookupLabel.DisplayMemberPathChanged)
                );

        private static void DisplayMemberPathChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LookupLabel t = d as LookupLabel;
            t.NotifyPropertyChanged("DisplayMemberPath");
            t.Content = GetContent(t);
        }

        [Localizability(LocalizationCategory.NeverLocalize)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Bindable(true)]
        [Category("Appearance")]
        public string DisplayMemberPath
        {
            get
            {
                return (string)GetValue(DisplayMemberPathProperty);
            }
            set
            {
                SetValue(DisplayMemberPathProperty, value);                
            }
        }
        #endregion DisplayMemberPath

        protected static object GetContent(LookupLabel label)
        {
            if (label.ItemsSource == null)
            {
                return null;
            }
            if (string.IsNullOrWhiteSpace(label.SelectedValuePath))
            {
                return null;
            }
            if (string.IsNullOrWhiteSpace(label.DisplayMemberPath))
            {
                return null;
            }
            if (label.SelectedValue == null)
            {
                return null;
            }

            object result = null;
            System.Reflection.PropertyInfo valuePropertyInfo = null;
            foreach (var item in label.ItemsSource)
            {
                if (valuePropertyInfo == null)
                {
                    valuePropertyInfo = item.GetType().GetProperty(label.SelectedValuePath);
                    if (valuePropertyInfo == null)
                    {
                        return null;
                    }
                }

                if (valuePropertyInfo.GetValue(item, null).Equals(label.SelectedValue))
                {
                    var displayPropertInfo = item.GetType().GetProperty(label.DisplayMemberPath);
                    if (displayPropertInfo == null)
                    {
                        return null;
                    }
                    else
                    {
                        result = displayPropertInfo.GetValue(item, null);
                        break;
                    }                    
                }
            }

            return result;
        }
    }
}
于 2013-06-07T23:45:32.033 回答