【发布时间】:2016-09-20 16:02:54
【问题描述】:
我正在使用 WPF 组合框来过滤项目,但我决定将它放在我的数据网格中,但我无法让它工作可能在他们的我只能让它在数据网格之外工作。
我认为问题是因为
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, or ElementName=win
在数据网格内部不支持,所以我如何让它工作。
这是我得到的错误
System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel='1''的绑定源。 BindingExpression:Path=SelectedParam;数据项=空;目标元素是'ComboBox'(名称='Krydsmålbox');目标属性是“SelectedValue”(类型“对象”)
<DataGrid x:Name="hjuldata"
ItemsSource="{Binding Source={StaticResource cvsTasks}}"
CanUserAddRows="False" BorderBrush="#FF303030" Foreground="#FF00FB0B" Background="#FF303030" AutoGenerateColumns="False" GridLinesVisibility="None" VerticalAlignment="Center" Height="644" Canvas.Left="20" Canvas.Top="257" Width="1250" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Krydsmålet}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.Header>
<ComboBox x:Name="Krydsmålbox" Foreground="#FFEAEAEA" Background="#FF303030" FontSize="12"
Style="{StaticResource ComboBoxTest2}" ItemTemplate="{StaticResource cmbTemplate2}"
ItemsSource="{Binding}" SelectedValuePath="Krydsmålene"
SelectedValue = "{Binding SelectedParam, RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}},UpdateSourceTrigger=PropertyChanged}" BorderBrush="#FF303030" Height="40" DockPanel.Dock="Top" IsSynchronizedWithCurrentItem="True" SelectionChanged="Krydsmålbox_SelectionChanged" Canvas.Left="813" Canvas.Top="96" Width="146"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
数据模板
<DataTemplate x:Key="cmbTemplate2">
<WrapPanel Margin="0 5 0 5" Height="30">
<Image Width="10" Height="20" Stretch="Fill" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,15,0"/>
<Label Content="{Binding Krydsmålene}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16" Foreground="#FF00FB0B"/>
</WrapPanel>
</DataTemplate>
CS
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string SelectedParam
{
get { return _selectedParam; }
set
{
_selectedParam = value; OnPropertyChanged("SelectedParam");
if (_selectedParam == "Krydsmål") { BindData(); } else { hjuldata.ItemsSource = FilterKategori().Tables[0].DefaultView; ; }
}
}
public DataSet DTbindkryds()
{
Data = @"SELECT Krydsmålene FROM Data.Krydsmål";
//SQL statement to fetch entries from Krydsmål
DataSet dsdata = new DataSet();
//Open SQL Connection
using (conn = new SqlConnection(connStrings))
{
conn.Open();
//Initialize command object
using (conn = new SqlConnection(connStrings))
using (cmd = new SqlCommand(Data, conn))
{
SqlDataAdapter adapters = new SqlDataAdapter(cmd);
//Fill the result set
adapters.Fill(dsdata);
conn.Close();
}
}
return dsdata;
}
private void bindkrydsmål()
{
Krydsmålbox.ItemsSource = DTbindkryds().Tables[0].DefaultView;
}
【问题讨论】:
-
为什么不为网格定义一个数据模板并定义一个数据类型,以便您可以将选定的值直接绑定到某个属性?
-
因为我无法让 datatemplate 与 header 属性一起使用
-
有可能。搜索 wpf datagrid header 模板
-
我曾尝试使用
<DataGridTextColumn.Header> <DataTemplate> <ComboBox </DataTemplate>,然后它在我的组合框中显示 system.windows.datatemplate 并且我的组合框在当前上下文中不存在 -
问题在于你的
Binding,你的Path应该指向DataContext.SelectedParam。