Laden...

[Erledigt] User Control in XAML einen Namen geben

Erstellt von SteffoD vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.372 Views
S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren
[Erledigt] User Control in XAML einen Namen geben

Hallo,
ich möchte gerne auf ein User Control zugreifen in dem ich ihm einen Namen in XAML gebe.
Versuche ich das, erhalte ich allerdings folgende Fehlermeldung:> Fehlermeldung:

InvalidOperationException: "DisplayMemberPath" und "ItemTemplate" können nicht beide festgelegt werden.

Ich möchte hier auf _ImageCaptureControl _ zugreifen und bekomme besagte Fehlermeldung:

<UserControl x:Class="LR4ConnectionGUI.Controls.ConnectionControl"
             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:LR4ConnectionGUI.Controls"
             xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
             mc:Ignorable="d" >
    <StackPanel>
        <local:ImageCaptureControl x:Name="ImageCapture_Control"/>
    </StackPanel>
</UserControl>

Wenn ich das x:Name Attribut entferne, kompiliert alles.

Das ist das XAML von ImageCaptureControl:

<UserControl x:Class="LR4ConnectionGUI.Controls.ImageCaptureControl"
             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:LR4ConnectionGUI.Controls"
             xmlns:viewmodel="clr-namespace:LR4ConnectionGUI.ViewModel"
             mc:Ignorable="d">
    <GroupBox Margin="10,10,0,10">
        <GroupBox.Header>
            Eingangs-Daten
        </GroupBox.Header>

        <StackPanel>
            <ListView Margin="0, 10, 0, 10"
                      ItemsSource="{Binding Rois}" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Selektiertes ROI" Width="130" DisplayMemberBinding="{Binding Name}" />
                        <GridViewColumn Header="Oben links" Width="90" DisplayMemberBinding="{Binding TopLeft}" />
                        <GridViewColumn Header="Unten rechts" Width="90" DisplayMemberBinding="{Binding BottomRight}" />
                    </GridView>
                </ListView.View>
            </ListView>

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="190" />
                    <ColumnDefinition Width="50" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <Label Content="Mittelung über Anzahl Bilder:"/>
                <TextBox Text="{Binding AveragingOverNumberOfImages}" Grid.Column="1"/>
            </Grid>

            <GroupBox Margin="10,10,0,10">
                <GroupBox.Header>
                    Aufnahme-Modus
                </GroupBox.Header>

                <StackPanel Name="StackPanelImageCapture" HorizontalAlignment="Left">
                    <ComboBox ItemsSource="{Binding ImageCaptureModes}"
                        SelectedValue="{Binding SelectedImageCaptureMode}"
                        DisplayMemberPath="{Binding Name}"
                        SelectionChanged="ImageCaptureMode_SelectionChanged"
                        MinWidth="100">
                        <ComboBox.ItemTemplate>
                            <DataTemplate DataType="{x:Type viewmodel:ImageCaptureModeViewModel}">
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </StackPanel>
            </GroupBox>
        </StackPanel>
    </GroupBox>
</UserControl>

Weiß jemand weiter?

Danke im Voraus!
SteffoD

5.658 Beiträge seit 2006
vor 5 Jahren

Hi SteffoD,

das Problem hat nichts mit dem Namen des Controls zu tun, sondern nur mit diesem Codeausschnitt:

  
<ComboBox ItemsSource="{Binding ImageCaptureModes}"  
  SelectedValue="{Binding SelectedImageCaptureMode}"  
  DisplayMemberPath="{Binding Name}"  
  SelectionChanged="ImageCaptureMode_SelectionChanged"  
  MinWidth="100">  
  <ComboBox.ItemTemplate>  
  	<DataTemplate DataType="{x:Type viewmodel:ImageCaptureModeViewModel}">  
  		<TextBlock Text="{Binding Name}"/>  
  	</DataTemplate>  
  </ComboBox.ItemTemplate>  
</ComboBox>  

Wenn du das ItemTemplate der ComboBox überschreibst, dann kannst (bzw. mußt) du selbst festlegen, wie das Item aussieht, und welche Werte dort angezeigt werden. Daher ist die Angabe der DisplayMemberPath-Eigenschaft überflüssig.

Weeks of programming can save you hours of planning

S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren

Hi MrSparkle,
vielen Dank! Das hat mir viel Arbeit gespart! Seltsam, dass das ohne das Name-Attribut problemlos kompiliert!

Nochmals danke und einen schönen Tag noch!
SteffoD

5.658 Beiträge seit 2006
vor 5 Jahren

Da habe ich momentan auch keine Antwort darauf. Allerdings wundert mich, daß du den Namen überhaupt brauchst. In deinem Code greifst du ja nicht darauf zu. Ich befürchte daher, daß du im Code-Behind auf das Control zugreifst, um irgendwelche Eigenschaften zu setzen oder Aktionen auszulösen. Das sollte man aber vermeiden, und stattdessen DependencyPropertys bzw. Commands verwenden.

Weeks of programming can save you hours of planning

S
SteffoD Themenstarter:in
44 Beiträge seit 2018
vor 5 Jahren

ImageCaptureControl ist gleichzeitig auch ein Observer. Eigentlich wollte ich nur diese Instanz durchreichen.