Caliburn Micro MVVM INotifyPropertyChange - PullRequest
       8

Caliburn Micro MVVM INotifyPropertyChange

0 голосов
/ 13 марта 2019

Итак, я использую Cliburn Micro, и у меня есть коллекция Bindable, давайте называть ее пользователями.

        public BindableCollection<UserModel> Users
    {
        get { return _users; }
        set
        {
            _users = value;
            NotifyOfPropertyChange(() => Users);

        }
    }

Теперь это связано с сеткой данных с двумя столбцами FirstName и LastName. На другой панели выбранный элемент сетки данных будет установлен

                <DataGrid x:Name="AllUsers" SelectionMode="Single" Margin="5"
                  SelectionUnit="FullRow" AutoGenerateColumns="False" 
                  CanUserAddRows="False" CanUserDeleteRows="False" 
                  CanUserReorderColumns="False" 
                  IsReadOnly="True" Style="{DynamicResource DataGridUsers}"
                  SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}"
                  cal:Message.Attach="[Event MouseDoubleClick] = [Action DoubleClickUser()]">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" Width="*"/>
                    <DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>

Затем я создал TextBoxFirstName и установил значение, только если оно не равно нулю

                            <DockPanel>
                            <Label x:Name="LabelFirstName" Width="80" HorizontalContentAlignment="Left" VerticalAlignment="Center" Foreground="#FFAD231F" FontFamily="Lucida Sans Unicode" FontSize="12" >First Name</Label>
                            <TextBox x:Name="TextBoxFirstName" Margin="0,0,5,0" Text="{Binding 
                    UpdateSourceTrigger=PropertyChanged, Path=TextBoxFirstName,
                    ValidatesOnDataErrors=true, NotifyOnValidationError=true}" 
                    HorizontalAlignment="Stretch" Height="23" TextAlignment="Center" TextWrapping="NoWrap" VerticalAlignment="Top" Style="{StaticResource RoundedTextBox}" FontFamily="Lucida Sans Unicode"/>
                        </DockPanel>

Проверка моей ошибки в текстовом поле:

        public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "TextBoxFirstName")
            {
                if (string.IsNullOrEmpty(TextBoxFirstName))
                {
                    result = "Please enter a First Name";
                }
                else
                {
                    SelectedUser.FirstName = TextBoxFirstName;
                    NotifyOfPropertyChange(() => SelectedUser);
                }

            }
            return result;
        }
    }

Теперь я знаю, что SelectedUser.FirstName обновляется так, как если бы я установил привязку к другому текстовому полю для SelectedUser.FirstName, он обновляется, как и ожидалось, но не обновляет ли Datagrid при его изменении? но если я обновлю значение во втором текстовом поле (с привязкой SelectedUser.FirstName), оно обновит сетку данных,

AnyIdeas ?? В основном я хочу обновить сетку данных только в том случае, если значение в текстовом поле проходит проверку. Предположим, я не хочу редактировать значения в самой сетке данных.

Сводя меня с ума, я знаю, что это должно быть так, как он уведомляет, но я не могу заставить его работать, и я довольно новичок в c # и MVVM и WPF, любая помощь будет принята с благодарностью. спасибо

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вам нужно NotifyOfPropertyChange для FirstName вместо SelectedUser. Желательно, чтобы вы делали это в установщике FirstName.

0 голосов
/ 13 марта 2019

Итак, способ реализации IDataError был неверным, вам не нужно устанавливать значение в операторе else. Способ, которым я должен был это реализовать.

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

Также моя модель выглядит так,

namespace App.Models
{
public class ConfigModel : INotifyPropertyChanged
{

    private bool _showConfig;

    public event PropertyChangedEventHandler PropertyChanged;

    public bool ShowConfig
    {

        get { return this._showConfig; }
        set
        {
            this._showConfig = value;
            this.OnPropertyChanged("ShowConfig");
        }
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

Спасибо за помощь от Уэса и Марка за то, что они указали мне правильное направление.

...