Вопрос об использовании WindowsFormsHost. (с DataBinding)

Я плохо владею английским, потому что я не носитель английского языка. Надеюсь, ты понимаешь.

Мне нужно использовать элемент управления WindowsFormsHost, потому что я использую DataGridView WinForm. Я не могу управлять DataGrid в WPF по некоторым причинам.

В файле .cs мне удалось использовать WindowsFormsHost с DataGridView WinForm. Код показан ниже.

var tabItem = new ClosableTab();


#region Core Logic
var winformControl = new WindowsFormsHost();
winformControl.VerticalAlignment = VerticalAlignment.Stretch;
winformControl.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;

winformControl.Child = new DataGridView();
DataGridView parsingTableView = winformControl.Child as DataGridView;
parsingTableView.EditMode = DataGridViewEditMode.EditProgrammatically;
parsingTableView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
parsingTableView.DataSource = mainWindow.editor.TokenTable;
parsingTableView.CellMouseEnter += new DataGridViewCellEventHandler(this.tableGridView_CellMouseEnter);

tabItem.Content = winformControl;
#endregion


this.mainWindow.tablControl.Items.Add(tabItem);

Теперь я хочу преобразовать приведенную выше логику в XAML, поэтому я написал логику, как показано ниже.

Сначала я определил DataTemplate для отображения типа DataTable.

// В файле ресурсов

xmlns:systemData="clr-namespace:System.Data;assembly=System.Data"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

<DataTemplate DataType="{x:Type systemData:DataTable}">
    <WindowsFormsHost>
        <WindowsFormsHost.Child>
            <wf:DataGridView DataSource="{Binding}" EditMode="EditProgrammatically" AutoSizeColumnsMode="AllCells"/>
        </WindowsFormsHost.Child>
    </WindowsFormsHost>
</DataTemplate>

Теперь указанный выше шаблон DataTemplate используется при привязке к Content, как показано в приведенном ниже коде.

// В файле xaml

<Grid>
    <TabControl ItemsSource="{Binding SelectedItem}">
        <TabItem Header="{lex:Loc Key=TokenTable}" Content="{Binding TokenTable}"/>
    </TabControl>
</Grid>

Когда я выполняю приведенный выше код, я столкнулся с ошибкой, как показано ниже, в DataSource = "{Binding}".

введите здесь описание изображения

Если мне придется переводить указанную выше ошибку, используя мои плохие знания английского языка. Ошибка говорит мне. «Невозможно настроить привязку к свойству DataSource». «Связывание можно настроить только на DependencyProperty объекта DependencyObject».

Я думаю, что знаю, какую ошибку пытаюсь сказать мне, но я не знаю, что я делаю, чтобы решить указанную выше проблему.

Что мне делать, чтобы решить эту проблему?

Спасибо за чтение.


person jjw    schedule 13.12.2019    source источник


Ответы (1)


Вы не можете выполнить прямую привязку к свойству DataSource объекта DataGridView, потому что это не свойство зависимости.

Что вы можете сделать, так это обойти это, создав прикрепленное свойство, которое вы установили в WindowsFormsHost, как предлагается здесь, а затем установите свойство DataGridView, используя обратный вызов присоединенного свойства:

public static class WindowsFormsHostMap
{
    public static readonly DependencyProperty DataSourceProperty
        = DependencyProperty.RegisterAttached("DataSource", typeof(object), 
            typeof(WindowsFormsHostMap), new PropertyMetadata(OnPropertyChanged));

    public static string GetText(WindowsFormsHost element) => (string)element.GetValue(DataSourceProperty);

    public static void SetText(WindowsFormsHost element, object value) => element.SetValue(DataSourceProperty, value);

    static void OnPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var dataGridView = (sender as WindowsFormsHost).Child as DataGridView;
        dataGridView.DataSource = e.NewValue;
    }
}

XAML:

<WindowsFormsHost local:WindowsFormsHostMap.DataSource="{Binding}">
person mm8    schedule 13.12.2019
comment
Думаю решить эту проблему, если последую вашему совету. Спасибо за ваш ответ. - person jjw; 13.12.2019