加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使我的WPF用户控件的依赖属性更新我的视图模型?

发布时间:2020-12-14 00:49:06 所属栏目:百科 来源:网络整理
导读:我试图创建一个用依赖属性来绑定的用户控件.在内部我有一个绑定到这些相同属性的ComboBox,但绑定只能以一种方式工作. ComboBox从ItemsSource填充,但SelectedItem没有被更新回到我绑定的viewmodel. 一个简化的例子: 这是与用户控件绑定的视图模型: public c
我试图创建一个用依赖属性来绑定的用户控件.在内部我有一个绑定到这些相同属性的ComboBox,但绑定只能以一种方式工作. ComboBox从ItemsSource填充,但SelectedItem没有被更新回到我绑定的viewmodel.

一个简化的例子:

这是与用户控件绑定的视图模型:

public class PeopleViewModel : INotifyPropertyChanged
{
    public PeopleViewModel()
    {
        People = new List<string>( new [] {"John","Alfred","Dave"});
        SelectedPerson = People.FirstOrDefault();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private IEnumerable<string> _people;
    public IEnumerable<string> People 
    { 
        get { return _people; } 
        set
        {
            _people = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this,new PropertyChangedEventArgs("People"));
            }
        }
    }

    private string _selectedPerson;
    public string SelectedPerson 
    {
        get { return _selectedPerson; }
        set 
        { 
            _selectedPerson = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this,new PropertyChangedEventArgs("SelectedPerson"));
            }
        } 
    }
}

这是用户控件:

<UserControl x:Class="PeopleControlTest.PeopleControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" d:DesignHeight="56" d:DesignWidth="637">
<StackPanel >
    <ComboBox Margin="11"
              ItemsSource="{Binding BoundPeople,RelativeSource={RelativeSource AncestorType=UserControl}}"
              SelectedItem="{Binding BoundSelectedPerson,RelativeSource={RelativeSource AncestorType=UserControl}}"/>
</StackPanel>

代码背后

public partial class PeopleControl : UserControl
{
    public PeopleControl()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty BoundPeopleProperty =
        DependencyProperty.Register("BoundPeople",typeof(IEnumerable<string>),typeof(PeopleControl),new UIPropertyMetadata(null));

    public static readonly DependencyProperty BoundSelectedPersonProperty =
        DependencyProperty.Register("BoundSelectedPerson",typeof(string),new UIPropertyMetadata(""));

    public IEnumerable<string> BoundPeople
    {
        get { return (IEnumerable<string>)GetValue(BoundPeopleProperty); }
        set { SetValue(BoundPeopleProperty,value); }
    }

    public string BoundSelectedPerson
    {
        get { return (string)GetValue(BoundSelectedPersonProperty); }
        set { SetValue(BoundSelectedPersonProperty,value); }
    }
}

这是我如何在主窗口中绑定用户控件(将Windows数据上下文设置为viewmodel的一个实例)

<Window x:Class="PeopleControlTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:controls="clr-namespace:PeopleControlTest"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <controls:PeopleControl 
            BoundPeople="{Binding People}" 
            BoundSelectedPerson="{Binding SelectedPerson}"/>
    </Grid>
</Window>

用户控件中的组合框填写名称,但是当我选择一个不同的名称时,它不会被更新回到视图模型.任何想法我在这里失踪?

谢谢!

一些属性默认绑定双向(包括SelectedItem),但您的BoundSelectedPerson不.您可以设置绑定的模式:
<controls:PeopleControl 
            BoundPeople="{Binding People}" 
            BoundSelectedPerson="{Binding SelectedPerson,Mode=TwoWay}"/>

或者您可以通过在DependencyProperty上设置一个标志来默认为TwoWay:

public static readonly DependencyProperty BoundSelectedPersonProperty =
        DependencyProperty.Register("BoundSelectedPerson",new FrameworkPropertyMetadata("",FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读