none
Problem bei Änderung Borderthickness von einem UserControl indem ein DataGrid auf ActualWidth gebindet ist RRS feed

  • Frage

  • Hallo Community,

    ich hätte eine Umsetzungsfrage.

    Ausgangsstellen:

    • Hab ein UserControl welches ein DataGrid beinhaltet.
      Das DataGrid hat Width="{Binding ElementName=UsercontrolName, Path=ActualWidth}" und eine Spalte hat Width="*" damit die Spalte alles ausfüllt.
    • Setzte ich dieses UserControl in ein ScrollViewer mit  HorizontalScrollBarVisibility="Auto" und ändere dann die Borderthickness im Code-Behind, dann friert das Fenster ein.

    Kann man das trotzdem irgendwie umsetzen?
    Mein Versuch war die HorizontalScrollBarVisibility zu disablen und später wieder auf "Auto" zu stellen. Nur weiß ich nicht wie ich auf "Alles fertig neu gezeichnet" warten kann bzw. ob es eine schönere Umsetzung gibt.


    Code Beispiel:

    UserControl XAML

    <UserControl x:Class="WpfTestArea.UserControls.UserControlSimple"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:WpfTestArea.UserControls"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="800" Name="UsercontrolName">
        <StackPanel>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0">text</TextBlock>
                <DataGrid Name="dataGridWpf" 
                      Height="200" AutoGenerateColumns="False" 
                      Grid.Row="1"
                      Width="{Binding ElementName=UsercontrolName, Path=ActualWidth}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="eins"/>
                        <DataGridTextColumn Header="zwei" Width="*" x:Name="header2"/>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </StackPanel>
    </UserControl>

    MainWindow XAML

    <Window x:Class="WpfTestArea.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfTestArea"
            xmlns:uc="clr-namespace:WpfTestArea.UserControls"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
    
        <DockPanel>
    
            <ScrollViewer x:Name="myScrollViewer2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                <StackPanel Name="stackPanelTest">
                    <uc:UserControlSimple DockPanel.Dock="Top" x:Name="testingWPF"/>
                </StackPanel>
            </ScrollViewer>
    
        </DockPanel>
    </Window


    MainWindow c#

    namespace WpfTestArea
    {
        public partial class MainWindow : Window
        {
    
            public MainWindow()
            {
                InitializeComponent();
    
                testingWPF.BorderBrush = new SolidColorBrush(Colors.DarkGoldenrod);
                testingWPF.Margin = new Thickness(20);
    
    // --> Wenn ich das auskommentiere entsteht das Problem
                //testingWPF.BorderThickness = new Thickness(2);
    
            }
         }
    }

    Wenn BorderThickness-Zeile auskommentiert:

    Wenn BorderThickness-Zeile einkommentiert: (MainWindow ist nicht mehr bedienbar)

    Liebe Grüße


    Freitag, 25. September 2020 11:20

Antworten

  • Hab die Lösung gefunden.

    Wenn ich im UserControl das DataGrid Binding

    Width="{Binding ElementName=UsercontrolName, Path=ActualWidth}"

    nicht auf mein Usercontrol binde, sondern auf mein DataGrid, dann funktioniert das mit Width="*".

        <StackPanel>
            <Grid Name="myUcGrid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0">text</TextBlock>
                <DataGrid Name="dataGridWpf" 
                      Height="200" AutoGenerateColumns="False" 
                      Grid.Row="1"
                      Width="{Binding ElementName=myUcGrid, Path=ActualWidth}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="eins"/>
                        <DataGridTextColumn Header="zwei" Width="*" x:Name="header2"/>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </StackPanel>
    

    • Als Antwort markiert DontKnow92009 Sonntag, 6. Dezember 2020 15:59
    Sonntag, 6. Dezember 2020 15:59

Alle Antworten

  • Hallo DontKnow92009,

    Um eine erfolgreiche Datenbindung zu erreichen, müsst Du die ItemSource-Eigenschaft von DataGrid verwenden. Du kannst jede Datenquelle binden, die IEnumerable implementiert. Jede Zeile im DataGrid ist an ein Objekt in der Datenquelle gebunden, und jede Spalte im DataGrid ist an eine Eigenschaft der Datenquellenobjekte gebunden. Weitere Einblicke in das Thema findest Du in diesem Tutorial:
    DataGrid in WPF > Data Binding

    Gruß,

    Ivan Dragov

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 29. September 2020 08:48
    Moderator
  • Hallo Ivan,

    mein Problem bezieht sich nicht auf den Inhalt im DataGrid und die Datenbindung von diesem Inhalt.
    Es geht hierbei auch nicht um das Aussehen vom Inhalt des DataGrids wie Cell-Border.

    Mein Problem bezieht sich auf den Border vom UserControl das ich anpassen möchte. Die Besonderheit ist das DataGrid welches sich darin befindet und welches die Width von dem UserControl-ActualWidth gebunden hat, in Verbindung mit dem ScrollViewer mit HorizontalScrollbarVisibility.

    Liebe Grüße

    Dienstag, 29. September 2020 16:56
  • Hab die Lösung gefunden.

    Wenn ich im UserControl das DataGrid Binding

    Width="{Binding ElementName=UsercontrolName, Path=ActualWidth}"

    nicht auf mein Usercontrol binde, sondern auf mein DataGrid, dann funktioniert das mit Width="*".

        <StackPanel>
            <Grid Name="myUcGrid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0">text</TextBlock>
                <DataGrid Name="dataGridWpf" 
                      Height="200" AutoGenerateColumns="False" 
                      Grid.Row="1"
                      Width="{Binding ElementName=myUcGrid, Path=ActualWidth}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="eins"/>
                        <DataGridTextColumn Header="zwei" Width="*" x:Name="header2"/>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </StackPanel>
    

    • Als Antwort markiert DontKnow92009 Sonntag, 6. Dezember 2020 15:59
    Sonntag, 6. Dezember 2020 15:59