关于使用 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."
我想我知道要对我说什么错误,但我不知道如何解决上述问题。
我应该怎么做才能解决这个问题?
感谢您的阅读。
您 不能 直接绑定到 DataGridView
的 DataSource
属性,因为它不是依赖项 属性 .
您可以解决此问题,方法是创建一个附加的 属性,按照建议 WindowsFormsHost
在 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}">
我的英语水平很差,因为我的母语不是英语。 希望大家理解。
因为使用了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."
我想我知道要对我说什么错误,但我不知道如何解决上述问题。
我应该怎么做才能解决这个问题?
感谢您的阅读。
您 不能 直接绑定到 DataGridView
的 DataSource
属性,因为它不是依赖项 属性 .
您可以解决此问题,方法是创建一个附加的 属性,按照建议 WindowsFormsHost
在 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}">