0

私はこのようなコードを使用しています

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

ComboBox に会社名を表示します。IsEnabled が false に設定されていることに注意してください。これは、ユーザーに ComboBox を使用してほしくないためです。表示目的でIDを文字列に変換する簡単な方法として使用しています。

アイテムを Grid に配置すると、アイテムが多くなり、レンダリング パフォーマンスが大幅に低下していると思います。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

コレクションに多くのアイテムがあるため、コンボボックスの読み込みに時間がかかりすぎていると思います。

一般的なグッドプラクティスとして、そのうちの 1 つだけを表示する場合は、すべての会社をロードするべきではありません。

コンボボックスを使用する意図がよくわかりません。それはスタイルですか?将来的に有効にすることはできますか?それが 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 に答える