仅在单击列后才在comboboxcolumn中显示成员

时间:2011-09-04 11:02:12

标签: data-binding silverlight-4.0 mvvm-light telerik-grid

我有一个控件,当我需要有两列的dislay人: -全名 最好的朋友

问题是,Person上的属性BestFriend是一个对象。 在开始时,Person拥有自己的BestFriend,但他可以从组合框列中更改它。

现在,在控件加载后,bestfriend列是空白的。 当我在这个专栏上双击时,我可以更改bestfirend,并设置此人的最佳朋友。

但是我必须要做的就是开始时不是空白列?

我认为,问题是,那个控件无法匹配bestfriend,收集bestfriend,所以我认为我必须通过id匹配它们,但我不知道怎么办ti。

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

和viewmodel:

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>();

    }
}

和app 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 :(得分:0)

不是GridViewComboBoxColumn的专家,但可能是它正在查看绑定列表中的对象实例,而该实例不在其中?

使用“普通”组合框,您可以选择使用值绑定还是项绑定。在itembindng的情况下,ComboBox在值列表中查找相同的实例。如果找不到,则不会选择任何项目。

如果是Valuebinding,则将SelectedValue与SelectedValuePath指定的值进行比较。这意味着不要求列表条目和所选条目是同一个实例。

但正如我所说,这是针对盒子标准的ComboBoxes,对于Telerik控件......我真的不知道。但是根据我对它们的经验(使用WebForm控件),如果你在用户support forums中提问,那么它们就是一组有用的。