c# - Datagrid 组合框使 relativsource 工作

标签 c# wpf combobox datagrid

我正在使用 WPF 组合框来过滤项目,但我决定将它放在我的数据网格中,但我无法让它工作,可能在它们中我只能在数据网格之外时让它工作。

我觉得问题是因为

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, or ElementName=win

数据网格内部不支持,所以我该如何让它工作。

这是我得到的错误

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=SelectedParam; DataItem=null; target element is 'ComboBox' (Name='Krydsmålbox'); target property is 'SelectedValue' (type 'Object')

<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;
}

最佳答案

不要在 Header 属性中使用 DataTemplate,在 HeaderTemplate 中使用它,如下所示:

<DataGridTextColumn.HeaderTemplate>
  <DataTemplate>
    <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"/>
  </DataTemplate>
</DataGridTextColumn.HeaderTemplate>

一旦这样做,ElementNameRelativeSource 都应该可以工作。

如果您希望能够在后面的代码中按名称引用组合框,您可以使用 ContentPresenter 来呈现您想要的任何类型的 Header(我认为默认的 HeaderTemplate 是一个 TextBlock而不是 ContentPresenter):

<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>

关于c# - Datagrid 组合框使 relativsource 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37396660/

相关文章:

c# - 编辑数据表或添加组合框c#

c# - 为什么不允许 Array.Count 作为自己的索引值?

c# - 在 C# 中运行线程

c# - 更改 .NET 应用程序的程序集解析位置

c# - 自动调整 TabItem 宽度以填充空格?

javascript - PHP 后的 Javascript 中缺少变量

visual-c++ - 如何尽可能快地将大量字符串加载到 MFC 组合框控件中?

c# - Web API 2.2,具有路由覆盖的继承 Controller (这可能吗)?

c# - 为什么我的隐式 ContextMenu 样式不会覆盖 TextBox 上下文菜单样式?

c# .NET 绿屏背景移除