i have a usercontrol called filtercontrol that's in a in a itemscontrol. the itemscontrol ist bound to a observablecollection. the usercontrol has a dependency property that's set a guid. wenn the guid is set the usercontrol gets data from a source to fill itself.
when i run the program the usercontrols have different guid's that's returns different data but both of them display the data of the last.
xaml itemscontrol
<ItemsControl
Name="FiltersPanel"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
Margin="5,5,5,5">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="#ABADB3" BorderThickness="1">
<Grid Margin="5" Tag="{Binding Path=Guid}">
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition MaxHeight="300" />
</Grid.RowDefinitions>
<local:FilterControl Guid="{Binding Path=Guid}" />
<StackPanel
Grid.Row="1"
Grid.Column="0"
Orientation="Horizontal">
<Button
Name="BtnEditFilter"
Margin="5"
Click="BtnEditFilter_Click"
Content="Bearbeiten"
Tag="{Binding Path=Guid}" />
<Button
Name="BtnDeleteFilter"
Margin="5"
Click="BtnDeleteFilter_Click"
Content="Löschen"
Tag="{Binding Path=Guid}" />
</StackPanel>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
xaml filtercontrol
<UserControl
x:Class="MailFilter.WPF.FilterControl"
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:local="clr-namespace:MailFilter.WPF"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
MinWidth="300"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="5"
FontWeight="Bold"
Text="Bedingungen" />
<ItemsControl
Name="RulesPanel"
Grid.Row="1"
Grid.Column="0"
Margin="5">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid
Margin="5"
Loaded="Grid_Loaded"
Tag="{Binding Path=Guid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="0"
Margin="-3,-10,0,0"
FontWeight="Bold"
Loaded="TextBlock_Loaded"
Text="{Binding Path=DisplayChainText}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
MaxHeight="45"
Margin="5"
Text="{Binding Path=DisplayText}"
TextTrimming="CharacterEllipsis" />
<StackPanel
Grid.Row="1"
Grid.Column="1"
Orientation="Horizontal">
<Button
Name="BtnDeleteRule"
Margin="5"
Click="BtnDeleteRule_Click"
Content="Löschen"
Tag="{Binding Path=Guid}" />
<Button
Name="BtnRuleDataContextPopOut"
Margin="5"
Click="BtnRuleDataContextPopOut_Click"
Tag="{Binding Path=Guid}"
Visibility="Collapsed">
<Image Source="/popout-icon_black_20x20.png" />
</Button>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="5"
FontWeight="Bold"
Text="Aktionen" />
<ItemsControl
Name="ActionsPanel"
Grid.Row="3"
Grid.Column="0"
Margin="5">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="5"
Text="{Binding Path=DisplayText}" />
<Button
Name="BtnDeleteAction"
Grid.Row="1"
Grid.Column="0"
Margin="5"
HorizontalAlignment="Left"
Click="BtnDeleteAction_Click"
Content="Löschen"
Tag="{Binding Path=Guid}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>
codebehind filtercontrol
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace MailFilter.WPF
{
/// <summary>
/// Interaktionslogik für FilterControl.xaml
/// </summary>
public partial class FilterControl : UserControl
{
private static readonly ObservableCollection<RuleRepresenter> _rules = [];
private static readonly ObservableCollection<ActionRepresenter> _actions = [];
private static readonly Core.MailFilter mailFilter = MainWindow.Instance.MailFilter;
public static readonly DependencyProperty guid = DependencyProperty
.Register("Guid",
typeof(string),
typeof(FilterControl),
new PropertyMetadata(default(string), new PropertyChangedCallback(UpdateControl)));
public string Guid
{
get => (string)GetValue(guid);
set => SetValue(guid, value);
}
public FilterControl()
{
InitializeComponent();
RulesPanel.ItemsSource = _rules;
ActionsPanel.ItemsSource = _actions;
}
private static void UpdateControl(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
IEnumerable<FilterRule> rules = from filter in mailFilter.Filters
where filter.Guid == e.NewValue.ToString()
from rule in filter.Rules
select rule;
IEnumerable<FilterAction> actions = from filter in mailFilter.Filters
where filter.Guid == e.NewValue.ToString()
from action in filter.Actions
select action;
_rules.Clear();
_actions.Clear();
foreach (FilterRule rule in rules)
{
_rules.Add(RepresenterConverter.ConvertToRepresenter(rule));
}
foreach (FilterAction action in actions)
{
_actions.Add(RepresenterConverter.ConvertToRepresenter(action));
}
}
private void BtnDeleteRule_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("Bedingung wirklich löschen?", "MailFilter", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
Button button = (sender as Button)!;
RuleRepresenter ruleRepresenter = (from rule in _rules
where rule.Guid == button.Tag.ToString()
select rule).First();
_rules.RemoveAt(_rules.IndexOf(ruleRepresenter));
MainWindow.Instance.MailFilter.RemoveRule(ruleRepresenter.Guid);
}
}
private void BtnDeleteAction_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("Aktion wirklich löschen?", "MailFilter", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
Button button = (sender as Button)!;
ActionRepresenter actionRepresenter = (from action in _actions
where action.Guid == button.Tag.ToString()
select action).First();
_actions.RemoveAt(_actions.IndexOf(actionRepresenter));
MainWindow.Instance.MailFilter.RemoveAction(actionRepresenter.Guid);
}
}
private void BtnRuleDataContextPopOut_Click(object sender, RoutedEventArgs e) =>
new RuleDataContextPopOutWindow(
(from rule in _rules
where rule.Guid == (sender as Button)!.Tag.ToString()
select rule.DataContext).First())
.Show();
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Grid grid = (sender as Grid)!;
if ((from rule in _rules where rule.Guid == grid.Tag.ToString() select rule.RuleType).First() == 1)
{
(from object stackPanel in grid.Children
where stackPanel is StackPanel
from Button button in (stackPanel as StackPanel)!.Children
where button is Button && button.Name == "BtnRuleDataContextPopOut"
select button).First().Visibility = Visibility.Visible;
}
}
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
TextBlock textBlock = (sender as TextBlock)!;
if (textBlock.Text == "O\nR")
{
textBlock.Margin = new Thickness(-3, -3, 0, 0);
}
}
}
}