关于使用 WindowsFormsHost 的问题。 (使用数据绑定)

Question about using the WindowsFormsHost. (with DataBinding)

我的英语水平很差,因为我的母语不是英语。 希望大家理解。

因为使用了WinForm的DataGridView,所以需要使用WindowsFormsHost控件。 由于某些原因,我无法在 WPF 中控制 DataGrid。

在.cs文件中,我成功地将WindowsFormsHost与WinForm的DataGridView结合使用。 代码如下图

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>

现在,当绑定到 Content 时使用上面的 DataTemplate,如下面的代码所示。

// 在 xaml 文件中

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

当我执行上面的代码时,我在 DataSource="{Binding}" 处遇到如下错误。

如果我不得不用我糟糕的英语水平翻译上面的错误。 错误告诉我。 "It can't configure 'Binding' on the 'DataSource' property." "The 'Binding' can configure only on the DependencyProperty of the DependencyObject."

我想我知道要对我说什么错误,但我不知道如何解决上述问题。

我应该怎么做才能解决这个问题?

感谢您的阅读。

不能 直接绑定到 DataGridViewDataSource 属性,因为它不是依赖项 属性 .

您可以解决此问题,方法是创建一个附加的 属性,按照建议 WindowsFormsHostWindowsFormsHost 上设置,然后设置 属性 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}">