Bindigowanie do <TextBox> zagnieżdżonego w nagłówku <DataGrid>

0

Witam stworzyłem sobie DataGrid w którym w nagłówku umieściłem TextBoxa ( filtr dla tabeli). Problem polega na tym że nie mogę się do tego elementu się binding'ować . Jeżeli przeniosę ten element poza tabele wszytko działa.

<DataGrid
             IsReadOnly="True"
             x:Name="dataGridName"                     
             HorizontalAlignment="Left"                       
             AutoGenerateColumns="False"
             EnableRowVirtualization="False"   
             ItemsSource="{Binding CurrentDataTable}" 
             SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
             RowDetailsVisibilityMode="Visible" SelectionChanged="dataGridName_SelectionChanged" ColumnHeaderHeight="52"       
             MouseDoubleClick="dataGrid_MouseDoubleClick" >           

    <DataGrid.Columns>
                    <DataGridTextColumn Header="Id" Binding="{Binding id}"  />
                    <DataGridTextColumn  Header="Nazwa Firmy" Binding="{Binding Nazwa_Firmy}"  Width="120" >
                        <DataGridTextColumn.HeaderTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Vertical" HorizontalAlignment="Left"  >
                                    <TextBlock HorizontalAlignment="Center" Text="{Binding Content, RelativeSource=
                                         {RelativeSource Mode=TemplatedParent}}"/>
                                    <TextBox x:Name="txtId1"  ** Text="{Binding TextDescription, Mode=OneWayToSource,    UpdateSourceTrigger=PropertyChanged}"  ** Width="100" Style="{StaticResource Texbox_styl}"   />
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTextColumn.HeaderTemplate>
                    </DataGridTextColumn>

                    <DataGridTextColumn Header="NIP" Binding="{Binding NIP}" Width="100" />
</DataGrid>
            

Wiem że można ominąć ten problem np tak jak poniżej. Wiem także że mój sposób bindowania do zagnieżdżonego elementu musi być błeny

 <TextBox x:Name="txtId1"  TextChanged="TextZmiana" >

Jak poprawnie zbindować?

0

Sprawdź output window podczas po uruchomieniu aplikacji sprawdź output window w visualu tam powinieneś mieć wypisane błedy. Wewnątrz grida chces wyświetlić informacje nie zwiazaną z rekordami a w gridzie, tylko z zewnątrz, a dattemplate ma ustawiony datacontext na poszczególne rekordy. Żeby to mozesz stworzyć w pamietającą auktualny context, dodać ją do static resourcesz i bindować sie do niej jako zasób.

0

logi błedów:

 BindingExpression path error: 'TextDescription' property not found on 'object' ''String' (HashCode=1646772032)'. BindingExpression:Path=TextDescription; DataItem='String' (HashCode=1646772032); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')
0

no nic dzięki za wskazówkę szukam dalej

2

Spróbuj coś takiego:

  1. Do zdefiniowania nagłowka kolumny zamiast DataGridTextColumn.HeaderTemplate użyj po prostu <DataGridTextColumn.Header> i tam wrzuć swój StackPanel, w którym umieścisz swoją etykietkę <TextBlock Text="Nazwa Firmy"/> oraz swojego text boxa.
  2. Jeśli text box będzie umieszczony tak jak powyżej to (tak jak napisał topik92) jego wiązanie będzie do elementów w DataGridzie. Dlatego możesz nadać nazwę elementowi, do którego zbindowany jest cały view model i ustawić binding za jego pomocą jak na przykład poniżej:
<Grid x:Name="root">
        <DataGrid ItemsSource="{Binding CurrentDataTable}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Nazwa_Firmy}">
                    <DataGridTextColumn.Header>
                        <StackPanel>
                            <TextBlock Text="Nazwa Firmy"/>
                            <TextBox x:Name="txtId1" Text="{Binding ElementName=root, Path=DataContext.TextDescription}" />
                        </StackPanel>                        
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
</Grid>

0

Super wielkie dzięki
dodałem tylko

<Grid  x:Name="root" Background="LightGray" Margin="5" >

oraz bainding

<TextBox x:Name="txtId1" Text="{Binding ElementName=root, Path=DataContext.TextDescription ,UpdateSourceTrigger=PropertyChanged}"   TextChanged="TextZmiana"  />

I działa tak jak chciałem .
Jeszcze raz wielkie dziki i można zamknąć temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1