Отображение элемента в comboboxcolumn только после нажатия на столбец - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть элемент управления, когда мне нужно отобразить персонажа с двумя столбцами: -fullname -best friend

Проблема в том, что свойство BestFriend on Person является объектом.На старте у Person есть свой BestFriend, но он может изменить его в колонке со списком.

Теперь после загрузки элемента управления столбец с лучшим другом остается пустым.Когда я дважды щелкаю по этой колонке, я могу изменить bestfirend, и он устанавливает лучшую подругу этого человека.

Но что я должен сделать, чтобы при запуске не пустая колонка?

Я думаю, чтопроблема в том, что элемент управления не может сопоставить лучшего друга с коллекцией лучшего друга, поэтому я думаю, что должен сопоставить их по идентификатору, но я не знаю, как мне это сделать.

<UserControl x:Class="MvvmLight1.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d"
             Height="300"
             Width="300"
             DataContext="{Binding Main, Source={StaticResource Locator}}">



            <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">

        <telerik:RadGridView x:Name="grdSrL"
                             AutoGenerateColumns="False"
                             SelectionMode="Single"
                             IsReadOnly="False"
                             IsFilteringAllowed="True"
                             Height="386"
                             Width="460"
                             HorizontalAlignment="Left"
                             CanUserDeleteRows="False"
                             CanUserInsertRows="True"
                             CanUserReorderColumns="False"
                             CanUserResizeColumns="True" 
                             ItemsSource="{Binding Persons}">
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding FullName}" IsReadOnly="True" Header="FullName" />
                <telerik:GridViewComboBoxColumn ItemsSource="{Binding Friends,Source={StaticResource Main}}" ItemsSourceBinding="{Binding Friends,Source={StaticResource Main}}" Header="1st"
                                                DataMemberBinding="{Binding BestFriend}"        

                    DisplayMemberPath="FullName" />


            </telerik:RadGridView.Columns>
        </telerik:RadGridView>
    </Grid>
</UserControl>

основноймодель:

namespace MvvmLight1
{
    public class Person:INotifyPropertyChanged
    {
        private string _fullName;

        public string FullName
        {
            get { return _fullName; }
            set
            {
                if (_fullName!=value)
                {
                    _fullName = value;
                    OnPropertyChanged("FullName");
                }
            }
        }

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public Person BestFirend
        {
            get { return _bestFirend; }
            set
            {
                if (_bestFirend!=value)
                {
                    _bestFirend = value;
                    OnPropertyChanged("BestFirend");
                }
            }
        }

        private int _id;

        private Person _bestFirend;

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

и модель представления:

using System.Collections.ObjectModel;
using GalaSoft.MvvmLight;

namespace MvvmLight1.ViewModel
{
    public class MainViewModel : ViewModelBase
    {

        public MainViewModel()
        {
            for (int i = 0; i < 3; i++)
            {
                var friend = new Person() {FullName = "Name" + (i + 3).ToString()};
                _friends.Add(friend);
                _persons.Add(new Person(){FullName = "Name"+i.ToString(),Id = i,BestFirend = friend});
            }
        }

        private ObservableCollection<Person> _persons=new ObservableCollection<Person>();


        public ObservableCollection<Person> Persons
        {
            get { return _persons; }
            set
            {
                _persons = value;
            }
        }

        public ObservableCollection<Person> Friends
        {
            get { return _friends; }
            set
            {
                _friends = value;
            }
        }

        private ObservableCollection<Person> _friends=new ObservableCollection<Person>();

    }
}

и приложение xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             x:Class="MvvmLight1.App"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="clr-namespace:MvvmLight1.ViewModel"
             mc:Ignorable="d">
    <Application.Resources>
        <!--Global View Model Locator-->
        <vm:ViewModelLocator x:Key="Locator"
                             d:IsDataSource="True" />

        <vm:MainViewModel x:Key="Main"/>
    </Application.Resources>
</Application>

1 Ответ

0 голосов
/ 05 сентября 2011

Не эксперт по GridViewComboBoxColumn, но может ли быть так, что он ищет экземпляр объекта в связанном списке, а этот экземпляр отсутствует в нем?

С «обычными» комбинированными списками у вас есть выбор: использовать привязку значений или привязку элементов В случае itembindng ComboBox ищет тот же экземпляр в списке значений. Если он не может его найти, он не выбирает ни одного предмета.

В случае привязки значений SelectedValue сравнивается со значением, указанным в SelectedValuePath. Тогда это означает, что не требуется, чтобы запись списка и выбранная запись были одним и тем же экземпляром.

Но, как я уже сказал, это для стандартных ящиков ComboBox, как для элементов управления Telerik ... Я действительно не знаю. Но из моего опыта работы с ними (с элементами управления WebForm) они очень полезны, если вы задаете вопросы на их форумах пользователей .

...