0

次のコードで、Companys と Employees を単一の検索機能に結合する AutoCompleteBox (WPFToolkit を使用) を作成しています。AutoCompleteBox は CompositeCollections を処理する方法を知らないため、ObservableCollection を使用することを余儀なくされています (少なくとも、件名で見つけたものによると)。

会社のテキストが赤で、従業員のテキストが緑になるように、ドロップダウンとテキスト ボックスのスタイルを設定したいと思います。以下の ResourceDictionary に示すように、ドロップダウン全体のテキストの色を設定できますが、DataTrigger を使用する方法が見つかりません (以下にあるものは機能しません)。

DataTrigger を SearchCollection の各オブジェクトの ModelType プロパティにバインドする方法がわかりません。

編集:

コードをもう一度見てみると、ModelType というプロパティが VM で公開されていないことがわかりました。ModelType プロパティは、SearchCollection の各オブジェクトにあります。コレクション内の各オブジェクトの ModelType にバインドするにはどうすればよいですか?

XAML の場合:

    <toolkit:AutoCompleteBox Name="OmniSearchTextBox"
                             ItemsSource="{Binding SearchCollection}"
                             SelectedItem="{Binding Selection, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
                             KeyUp="OmniSearch_KeyUp"
                             MouseLeftButtonUp="OmniSearch_MouseLeftButtonUp"
                             IsTextCompletionEnabled="False" 
                             FilterMode="Contains" 
                             VerticalAlignment="Top" Margin="10,0" >

VM 内:

public sealed class SearchViewModel : ViewModelBase
{

    private ViewModelLocator _vmLocator;
    private ObservableCollection<Company> _companyList;
    private ObservableCollection<Employee> _employeeList;

    /// <summary>
    /// Initializes a new instance of the SearchViewModel class.
    /// </summary>
    public SearchViewModel()
    {
        try
        {
            _vmLocator = new ViewModelLocator();


            _searchCompCollection.Add(companies);
            _searchCompCollection.Add(employees);


            foreach (Company co in CompanyList)
            {
                _searchCollection.Add(co);
            }


            foreach (Employee emp in EmployeeList)
            {
                _searchCollection.Add(emp);
            }


        }
        catch (Exception ex)
        {

        }

    }


    private const string CompanyListPropertyName = "CompanyList";
    public ObservableCollection<Company> CompanyList
    {
        get
        {
            return (_vmLocator.CompanyVM).CompanyList;
        }
        set
        {
            if (_companyList == value)
            {
                return;
            }

            _companyList = value;
            RaisePropertyChanged(CompanyListPropertyName);
        }

    }


    private const string EmployeeListPropertyName = "EmployeeList";
    public ObservableCollection<Employee> EmployeeList
    {
        get 
        {
            return (_vmLocator.EmployeeVM).EmployeeList;  
        }
        set
        {
            if (_employeeList == value)
            {
                return;
            }

            _employeeList = value;
            RaisePropertyChanged(EmployeeListPropertyName);
        }

    }



    private ObservableCollection<ModelBase> _searchCollection = new ObservableCollection<ModelBase>();
    public ObservableCollection<ModelBase> SearchCollection
    {
        get { return _searchCollection; }
    }


    private string _selection = null;
    private string _origSelection = null;
    public string Selection
    {
        get
        {
            return _selection;
        }
        set
        {
            if (_selection != value)
            {
                _origSelection = _selection;
                _selection = value;
                try
                {
                    var item = _searchCollection.Single<Object>(x => x.ToString() == _selection);
                    this.SelectedObject = item;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
    }


    private object _selectedObject = null;
    private object _origSelectedObject = null;
    public object SelectedObject
    {
        get { 
            return _selectedObject; 
        }
        set
        {
            if (_selectedObject != value)
            {
                _origSelectedObject = _selectedObject;
                _selectedObject = value;

                switch(_selectedObject.GetType().BaseType.Name)
                {
                    case "Company":
                        RaisePropertyChanged("SelectedObject", 
                                             (Company)_origSelectedObject, 
                                             (Company)_selectedObject, 
                                             true);
                        break;

                    case "Employee":
                        RaisePropertyChanged("SelectedObject",
                                             (Employee)_origSelectedObject,
                                             (Employee)_selectedObject,
                                             true);

                        break;

                    default:

                        break;
                }
                RaisePropertyChanged("SelectedObject", _origSelectedObject, _selectedObject, true);
            }
        }
    }

}

ResourceDictionary (ModelType は各モデルで使用可能なプロパティであり、単純にクラス タイプ、つまり Company または Employee を返します):

<Style TargetType="{x:Type toolkit:AutoCompleteBox}">
    <Setter Property="Foreground" Value="DarkCyan" /> 
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=SearchCollection.ModelType}" 
                     Value="Company">  
            <Setter Property="Foreground" Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=SearchCollection.ModelType}" 
                     Value="Employee">  
            <Setter Property="Foreground" Value="Green" />
        </DataTrigger>
    </Style.Triggers>  
</Style>
4

0 に答える 0