Обновление UserControl при изменении родительского элемента - PullRequest
0 голосов
/ 01 марта 2020

Как правильно (MVVM) справиться со следующей ситуацией? У нас есть окно / пользовательский элемент управления, который содержит несколько пользовательских элементов управления и сетки. Когда мы выбираем элемент сетки, SelectedItem="{Binding SelectedAccount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" обновляет свойство SelectedAccount для пользовательских элементов управления

<TabItem Header="{x:Static p:Resources.Basic}">
    <DockPanel>
       <accounts:UCBasic x:Name="UCBasic" SelectedAccount="{Binding SelectedItem, ElementName=gridMain}"></accounts:UCBasic>
    </DockPanel>
</TabItem>
    <TabItem Header="{x:Static p:Resources.AdditionalData}">
    <DockPanel>
          <accounts:UCAdditionalData x:Name="UCAdditionalData" SelectedAccount="{Binding SelectedItem, ElementName=gridMain}"></accounts:UCAdditionalData >
    </DockPanel>
    ... more user controls ...
</TabItem>

, используя их DependencyProperty. Теперь, как бы я написал PageModel для вышеуказанных пользовательских элементов управления (UCBasic, UCAdditionalData), чтобы они могли загружать / отображать больше данных в зависимости от SelectedAccount из сетки. Существует грязный способ использования свойства change event, но я не думаю, что это нужно делать таким образом. Каждый пользовательский элемент управления имеет следующее:

public Account SelectedAccount
{
    get { return (Account)GetValue(SelectedAccountProp); }
    set
    {
        SetValue(SelectedAccountProp, value);
    }
}
public static readonly DependencyProperty SelectedAccountProp = DependencyProperty.Register("SelectedAccount", typeof(Account), typeof(UCBasic));

По существу, как бы я уведомил этот пользовательский элемент управления о том, что значение SelectedAccount изменилось, и он должен обновить себя (свои собственные текстовые поля, сетки и т. Д.)?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

, если каждый пользовательский элемент управления имеет свойство Account, он может выполнять привязки в своих собственных текстовых полях, сетках и т. Д., Например,

<TextBox Text="{Binding Account.Name, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
0 голосов
/ 01 марта 2020

1) вы можете использовать реализацию INotifyPropertyChanged в вашей ViewModel (если отправите уведомление об обновлении измененного свойства ViewModel в View) 2) Если вы используете одну ViewModel для обоих пользовательских элементов управления, 1 вариант должен помочь вам немедленно. Если вы используете разные ViewModels, вы должны обновить модель представления второго пользовательского элемента управления в коде при обновлении первого пользовательского элемента управления.

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