WPF&MVVM: Привязка свойств VM

233
14 октября 2017, 16:50

В вопросе Получение данных во ViewModel из делегированного объекта по поводу приведённого ниже кода View с привязками и паттерна MVVM в целом я понял следующее:

В отображении имеющихся данных у нас свойства экземпляров, которые передаются из VM и имена свойств экземпляров не могут не совпадать со именами свойств модели. Что касается полей для ввода новых данных, то там уже свойства VM. Получив значения этих свойств, мы используем их в команде добавления нового экземпляра.

<!-- Отображение имеющихся данных -->
<ListView ItemsSource="{Binding Path=staff}">
    <ListView.View>
        <GridView>
            <!-- ... -->
            <GridViewColumn DisplayMemberBinding="{Binding PersonStringifiedId, UpdateSourceTrigger=PropertyChanged}">
            <GridViewColumn DisplayMemberBinding="{Binding PersonFullName, UpdateSourceTrigger=PropertyChanged}" />
    <!-- ... -->

<!-- Ввод новых  данных -->
<TextBox>
    <TextBox.Text>
        <Binding Path="personStringifiedId"/>
    </TextBox.Text>
</TextBox>
<TextBox>
    <TextBox.Text>
        <Binding Path="personFullName"/>
    </TextBox.Text>
</TextBox>
<Button Command="{Binding addNewPersonCommand}"/>

К сожалению, одного только понимания выше сказанного не хватило, чтобы благополучно связать новое свойство VM с элементом View. По образцу в ответе на вопрос Добавление чекбоска в автоматически генерируемую таблицу я попытался привязать атрибуту IsChecked чекбокса свойство IsSelected ViewModel. Не вижу причины вводить это свойство в модель, потому на данный момент оно есть только во ViewModel.

<ListView ItemsSource="{Binding Path=Staff}">
    <!-- ... -->
        <GridViewColumn>
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Mode=TwoWay, 
                                RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, 
                                Path=IsSelected, 
                                UpdateSourceTrigger=PropertyChanged}"

При следующем коде VM реакция на изменение значения чекбокса (System.Diagnostics.Debug.WriteLine) отсуствует:

private bool personSelected = false; // по умолчанию
public bool IsSelected {
    get { return personSelected; }
    set {
        personSelected = value;
        System.Diagnostics.Debug.WriteLine(personSelected);
        OnPropertyChanged("IsSelected");
    }
}

Чего я недопонял в предыдущем вопросе?

READ ALSO
Асинхронный метод запускает AsyncCallback в текущем потоке

Асинхронный метод запускает AsyncCallback в текущем потоке

Имеется сервер класса TcpListenerОн принимает входящие подключения методом BeginAcceptTcpClient (AsyncCallback, Object)

222
Чтение данных из excel

Чтение данных из excel

Нашёл на просторах StackOverflow пример как читать данные из excelНо вылетают ошибки

174
Аналог Padding в RichTextBox

Аналог Padding в RichTextBox

Когда задан Padding для параграфа, то его формат передается следующей строке, после нажатия EnterИ убрать его получается только вручную

245
Что означает оператор &lt;&lt; в C#? [дубликат]

Что означает оператор << в C#? [дубликат]

На данный вопрос уже ответили:

296