簡體   English   中英

WPF 中的綁定未傳播到用戶控件中

[英]Binding in WPF not propagating into usercontrol

我是新手,正在學習 WPF。我正在制作一個演示項目來學習綁定和依賴屬性的工作。 為了便於理解,我簡要解釋一下這個項目。 在解決方案中,我有三個項目。 兩個項目是用戶控制,一個是主應用程序。

這是子頁面的用戶控件

    <UserControl x:Class="DefectTracking.DefectTrace"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="1200"
             Grid.IsSharedSizeScope="True"
             Loaded="ElementGeladen"
             Name="Self">
    <UserControl.Resources>
        <ResourceDictionary Source="Resources.xaml" />
    </UserControl.Resources>

    <UserControl.Style>
        <Style TargetType="{x:Type UserControl}">
            <Setter Property="Background" Value="{StaticResource Hintergrundfarbe}"/>
        </Style>
    </UserControl.Style>

    <Grid DataContext="{Binding ElementName=Self}" Margin="4">
        <FrameworkElement x:Name="ProxyElement"/>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <!--#region Kopfzeile -->
            <Grid Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="Ergebnisse"/>
                    <ColumnDefinition SharedSizeGroup="Name"/>
                    <ColumnDefinition SharedSizeGroup="Folgefehler" Width="*"/>
                    <ColumnDefinition SharedSizeGroup="Fehler"/>
                    <ColumnDefinition SharedSizeGroup="Aktiviert"/>
                </Grid.ColumnDefinitions>
                <TextBox Grid.Column="2" Style="{StaticResource FolgefehlerStil}" Text="FF" />
                <TextBox Grid.Column="3" Style="{StaticResource FehlerStil}" Text="Fehler"/>
                <TextBox Grid.Column="4" Style="{StaticResource FehlerStil}" Text="Aktiviert"/>
            </Grid>
            <!--#endregion-->

            <!--#region Prüfung -->
            <ItemsControl Grid.Row="1" ItemsSource="{Binding Prüfungen}" Name="Prüfungselement">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Background="Black">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition SharedSizeGroup="Ergebnisse"/>
                                <ColumnDefinition SharedSizeGroup="Name"/>
                                <ColumnDefinition SharedSizeGroup="Folgefehler"/>
                                <ColumnDefinition SharedSizeGroup="Fehler"/>
                                <ColumnDefinition SharedSizeGroup="Aktiviert"/>
                            </Grid.ColumnDefinitions>

                            <!--#region Ergebnisse -->
                            <ItemsControl Grid.Column="0" ItemsSource="{Binding Ergebnisse}" Style="{StaticResource ErgebnisStil}" Background="Black" MouseDoubleClick="ItemsControl_MouseDoubleClick">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <DockPanel/>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ItemsControl>
                            <!--#endregion-->

                            <!--#region Tabelle -->
                            <TextBox Grid.Column="1" Margin="10,0" MinWidth="50" Text="{Binding Path=Name}" Style="{StaticResource PrüfungsnameStil}"/>
                            <TextBox Grid.Column="2" MinWidth="40" Text="{Binding Path=Folgefehler}" Style="{StaticResource FolgefehlerStil}"/>
                            <TextBox Grid.Column="3" MinWidth="60" Text="{Binding Path=Fehler}" Style="{StaticResource FehlerStil}"  IsReadOnly="True"/>
                            <CheckBox Grid.Column="4" MinWidth="40" IsChecked="{Binding Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="5,0,0,0"/>
                            <!--#endregion-->

                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <!--#endregion-->
        </Grid>

        <!--#region Folgefehlerschieber -->
        <Canvas>
            <Thumb DragDelta="LinealVerschieben" Canvas.Left="450" Canvas.Top="0">
                <Thumb.Template>
                    <ControlTemplate>
                        <Grid>
                            <Line X1="0" Y1="0" X2="0" 
                                Y2="{Binding ActualHeight, Source={x:Reference ProxyElement}}"
                                Canvas.ZIndex="2"
                                Style="{StaticResource LinealStil}" Cursor="Hand">
                            </Line>
                            <Rectangle Width="11" Margin="0,0,20,0"
                                Height="{Binding ActualHeight, Source={x:Reference ProxyElement}}"
                                Style="{StaticResource AnfasserStil}" Cursor="Hand">
                                
                                <Rectangle.RenderTransform>
                                    <TranslateTransform X="-5" Y="0"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Label Style="{StaticResource LabelStil}" Content="{Binding Linealposition}"/>
                        </Grid>
                    </ControlTemplate>
                </Thumb.Template>
            </Thumb>
        </Canvas>
        <!--#endregion-->
    </Grid>
</UserControl>

我只是在測試

 <CheckBox Grid.Column="4" MinWidth="40" IsChecked="{Binding Status, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="5,0,0,0"/>

這是子頁面的用戶控件

    <UserControl x:Class="Demo.View.Dashboard"
             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:Demo.View"
             xmlns:vm="clr-namespace:Demo.ViewModel"
             xmlns:dt="clr-namespace:DefectTracking;assembly=DefectTrackingControl"
             mc:Ignorable="d" 
             d:DesignHeight="900" d:DesignWidth="1600"
             >
    <UserControl.DataContext>
        <vm:DashboardViewModel/>
    </UserControl.DataContext>
    
  
    <UserControl.Resources>
        <vm:BindingProxy x:Key="proxy" Data="{Binding}"/>
        <dt:Prüfung x:Key="www"/>
    </UserControl.Resources>

    <Grid Background="White">
        <dt:DefectTrace Margin="0,0,-321,-91">
            <dt:DefectTrace.Prüfungen>
                <dt:Prüfung 
                    Status="{Binding Path=status}" />
                <dt:Prüfung Name="Stabseite" />
                <dt:Prüfung Name="Stosskappe" />
                <dt:Prüfung Name="Druckbild" 
                                            />
                <dt:Prüfung Name="Oberfläche" 
                                            />
            </dt:DefectTrace.Prüfungen>

        </dt:DefectTrace>
        <CheckBox IsChecked="{Binding state,  Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}" Margin="100,100,100,10">Test check box</CheckBox>
    </Grid>
</UserControl>

我想用復選框綁定的屬性定義,但它不會傳播到用戶控件中。 如果我只是設置 true 和 false 那么它就可以工作但是如果我綁定那么它就不起作用。

任何幫助將不勝感激

我相信這里的問題是

<UserControl.DataContext>
    <vm:DashboardViewModel/>
</UserControl.DataContext>

因為這基本上意味着為此特定視圖使用 DashboardViewModel 的新實例,所以我假設在您的代碼中某處您正在使用此視圖的不同實例 model,其中更改 Status 的值並不重要。

如果原因是我認為的,並且您想在開發 XAML 文件時提高用戶舒適度,並使用它來幫助編譯器了解您可以使用 d:DataContext 的類型,例如:

d:DataContext={x:Type vm:DashboardViewModel}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM