Как установить / получить значение из свойства зависимости usercontrol? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть UserControl, в котором есть сетка, и я показываю список людей, и когда я нажимаю на строку в моей сетке, я получаю выбранный элемент строки в моем представлении model.my. Проблема в том, что я не могу получить выбранную строку в моем usercontrol в моем view3model SelectedPersonModel. Вот код, который я использую: Мой код UserControl Xaml и код позади:

<Grid>
    <DataGrid ItemsSource="{Binding PersonList,Mode=TwoWay,RelativeSource={RelativeSource AncestorType={x:Type Control:UcPersonList}}}" SelectedItem="{Binding SelectedRow,RelativeSource={RelativeSource AncestorType={x:Type Control:UcPersonList}}}"/>
</Grid>
 public partial class UcPersonList : UserControl
    {
        public UcPersonList()
        {
            InitializeComponent();
            this.DataContext = this;
        }

    #region PersonListProperty


    public static readonly DependencyProperty PersonListProperty =
    DependencyProperty.Register("PersonList", typeof(BindingList<PersonModel>), typeof(UcPersonList),
        new FrameworkPropertyMetadata
        {
            DefaultValue = new BindingList<PersonModel>(),
            BindsTwoWayByDefault = true
        });

    public BindingList<PersonModel> PersonList
    {
        get { return (BindingList<PersonModel>)GetValue(PersonListProperty); }
        set
        {
            SetValue(PersonListProperty, value);

        }
    }

    #endregion

    #region SelectedPerson



    public static readonly DependencyProperty SelectedRowProperty =
   DependencyProperty.Register("SelectedRow", typeof(PersonModel), typeof(UcPersonList),
       new FrameworkPropertyMetadata
       {
           DefaultValue = new PersonModel(),
           BindsTwoWayByDefault = true

       });

    public PersonModel SelectedRow
    {
        get { return (PersonModel)GetValue(SelectedRowProperty ); }
        set
        {
            SetValue(SelectedRowProperty , value);

        }
    }

    #endregion
}

На мой взгляд, у меня есть:

<my:UcPersonList x:Name="uclist" Grid.Row="2" PersonList="{Binding Path=PersonList,Mode=TwoWay}" SelectedRow="{Binding Path=SelectedPersonModel ,Mode=TwoWay}"  />

И моя ViewModel:

    public MainViewModel()
   {

       SelectedPersonModel = new PersonModel();
       PersonList = new BindingList<PersonModel>();
       PersonList.Add(new PersonModel { FirstName = "A", LastName = "AA", Age = 19 });
       PersonList.Add(new PersonModel { FirstName = "B", LastName = "BB", Age = 25 });
       PersonList.Add(new PersonModel { FirstName = "C", LastName = "CC", Age = 30 });
   }
  public BindingList<PersonModel> PersonList { get; set; }
  public PersonModel SelectedPersonModel{get;set;}

Я хочу установить User Control PersonList из моей viewmodel и получить selectedRow Значение свойства в viewmodel SelectedPersonModel property.how это сделать?

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Просто свяжите ваше свойство SelectedRow с SelectedPersonViewModel

Кроме того, выбор не будет отображаться с кодом, который вы опубликовали, потому что SelectedPersonModel, установленный в вашей ViewModel, несуществуют в вашем PersonList.См. Комментарии в коде ниже.

   public MainViewModel()
   {
       SelectedPersonModel = new PersonModel();
       PersonList = new BindingList<PersonModel>();
       PersonList.Add(new PersonModel { FirstName = "A", LastName = "AA", Age = 19 });
       PersonList.Add(new PersonModel { FirstName = "B", LastName = "BB", Age = 25 });
       PersonList.Add(new PersonModel { FirstName = "C", LastName = "CC", Age = 30 });

      // Either add SelectedPerson to list
      PersonList.Add(SelectedPersonModel);

      // or set SelectedPersonModel to an item that already exists in the list
      SelectedPersonModel = PersonList.FirstOrDefault();
   }

Также я согласен с HB, не устанавливайте свой DataContext внутри вашего UserControl.Он должен быть установлен при использовании UserControl, а не как часть UserControl.

0 голосов
/ 08 декабря 2011

Не устанавливайте DataContext на UC, это влияет на вашу "внешнюю" привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...