C # wpf Двухстороннее динамическое связывание для DataGrid (DataGridCheckColumn и DataGridTextColumn) - PullRequest
0 голосов
/ 06 марта 2019

Цель CheckBoxColumn TwoWay привязка для доступа пользовательского ввода.
Описание проблемы
1. Пустая таблица (поэтому экземпляр объекта не найден)
2. Как MVVM узнает, какой экземпляр объекта использовать? Есть ли опция отладки / справки для правильного набора текста?

.xaml

            <DataGrid x:Name="bGrid" ItemsSource="{Binding 
                Source=window.obColl_B, 
                UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
                  Path=BindsDirectlyToSource}" >
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn Width="0.25*" Header="Check" 
                        Binding="{Binding berCheck}" IsReadOnly="False" />
                    <DataGridTextColumn Width="0.5*" Header="Beruf" 
                        Binding="{Binding berName}" IsReadOnly="True" />
                </DataGrid.Columns>
            </DataGrid>

с #

public class obsColl : ObservableCollection<bEntry>
{
    public obsColl(List<string> berList, List<string> bActive) : base()
    {
        for (int i = 0; i < berList.Count; i++)
        {
            if (bActive.Contains(berList[i]))
                Add(new bEntry(true, berList[i]));
            else
                Add(new bEntry(false, berList[i]));
        }
    }
}
public class bEntry
{
    private bool _berCheck;
    private string _berName;
    public bEntry(bool check, string name)
    {
        this._berCheck = check;
        this._berName = name;
    }
    public bool berCheck
    {
        get { return _berCheck; }
        set { _berCheck = value; }
    }
    public string berName
    {
        get { return _berName; }
        set { _berName = value; }
    }
}

public partial class window : Window
{
    obsColl obColl_B;
    public AuswahlBerufWindow(List<string> berList, List<string> berActive)
    {
        obColl_B = new obsColl(cpy_berList, cpy_berActive);
        //so how does MVVM find the correct object to bind?
        InitializeComponent();
        ...

    }
}
// obColl_B automatically changes due to user input

Насколько я понял. ObservableCollection обрабатывает IPropertyChanged и INotifyChanged для меня, поэтому я должен быть в состоянии связать это с пользовательским вводом, используя Mode = TwoWay. Однако даже одиночные привязки терпят неудачу. Идея, которую я использовал, была от https://blogs.u2u.be/diederik/post/Codeless-two-way-data-binding-to-a-WPF-DataGrid

Однако я не совсем понимаю, как должен быть назначен правильный элемент для использования MVVM. В большинстве примеров используется статический ввод, который не поможет. Из того, что я прочитал, мне нужно предоставить объекты интерпретатора .xaml соответствующего типа (ObservableCollection), но я не знаю, как вернуть значения через Mode = TwoWay.

Я попробовал другой подход для написания DataTable вручную без привязки, но таким образом (определяя только тип, заголовок и только для чтения) было добавлено только количество флажков без содержимого. Достаточно интересно, что не удалось с исключениями.

Обновление 1 Ошибка 1. Привязка неверна / программа завершается с ошибкой «EditItem не разрешен для этого представления» и может быть исправлена, , если Path + Mode + UpdateSourceTrigger не установлен . Однако это выглядит «исправлено».
Обновление 2 Ошибка должна заключаться в неверном источнике объекта.

1 Ответ

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

В вашей ViewModel вы должны ввести свойство типа ObservableCollection.

В вашем XAML вы должны установить Datacontext либо для всей ViewModel, либо только для свойства.

Пример для привязки MainViewModel к вашему MainWindow.xaml

DataContext = "{Binding Main, Source = {StaticResource Locator}

MVVM знает, что использовать из-за ViewModelLocator

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

Я бы предложил использовать MVVM Light. MVVM Light предлагает вам неплохую базовую реализацию шаблона MVVM.

...