仅在单击列后才显示组合框列中的成员

发布于 2024-12-02 21:06:43 字数 5838 浏览 0 评论 0原文

当我需要显示两列的人时,我有一个控件: -全名 -bestfriend

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

现在,在控件加载后,最好朋友的列是空白的。 当我双击此列时,我可以更改 bestfirend,并且它设置此人的 bestfriend。

但我必须做什么才能在开始时不为空白列?

我认为问题是,该控件无法与 bestfriend 的集合匹配,所以我认为我必须通过 id 来匹配它们,但我不知道该怎么做。

<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>

I have a control, when I need dislay person with two column:
-fullname
-best friend

The problem is , that property BestFriend on Person is an object.
At start Person has his own BestFriend, but he can change it from combobox column.

Now, after control loaded the column with bestfriend is blank.
When I doubleclick at this column I can change bestfirend, and it sets bestfriend of this person.

But what I must to do to have at start not blank column?

I think, that the problem is, that control can't match bestfriend, with collection of bestfriend, so I think that I must match them by id, but I don't know how can I do 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>

the main model:

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

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

    }
}

and 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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怎言笑 2024-12-09 21:06:43

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

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

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

但正如我所说,这是针对盒子标准 ComboBox,至于 Telerik 控件......我真的不知道。但根据我对他们的经验(使用 WebForm 控件),如果您在他们的用户 support 中提出问题,他们是一群很有帮助的人论坛

Not an expert on GridViewComboBoxColumn, but could it be that it is looking an instance of an object in the bound list, and that instance is not in it?

With "normal" ComboBoxes you got the choice whether you use value binding or item binding. In case of itembindng, the ComboBox looks for the same instance in the list of values. If it cannot find it it does not select any item.

In case of Valuebinding, the SelectedValue is compared to the value specified by SelectedValuePath. This then means that there is no requirement that the list entry and the selected entry are the same instance.

But as I said, this is for box standard ComboBoxes, as for the Telerik controls ... I don't really know. But from my experience with them (with WebForm controls) they are a helpful bunch, if you ask questions in their user support forums.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文