gpt4 book ai didi

c# - 使用转换器将 WPF ContextMenu 绑定(bind)到 ObservableCollection 时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:02 25 4
gpt4 key购买 nike

也许有更好的方法来做到这一点,但这就是我现在所处的位置。我想将 ContextMenu 绑定(bind)到某种复杂类型的 ObservableCollection。复杂类型的属性将确定菜单项中显示的图标。我知道这样做的唯一方法是创建一个 ComplexTypeToMenuItem 转换器并将其与绑定(bind)相关联。但是,一旦我将转换器添加到绑定(bind)中,上下文菜单就不会在集合发生更改时更新。如果我删除转换器并依赖 ComplexType.ToString() 那么菜单项更新就好了。但是,在这种情况下没有图标。

这可以很容易地通过以下方式重现:

首先是 XAML

<Window x:Class="GoddamnContextMenuPosition.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GoddamnContextMenuPosition"
Title="MainWindow" Height="350" Width="525">

<Window.Resources>
<local:ComplexTypeToMenuItemConverter x:Key="ComplexTypeToMenuItemConverter" />
</Window.Resources>

<Grid>
<TextBox Grid.Row="0" Text="Hooray">
<TextBox.ContextMenu>
<ContextMenu ItemsSource="{Binding Objects, Source={x:Static local:Settings.Instance}, Converter={StaticResource ComplexTypeToMenuItemConverter}}">
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>

<Button Grid.Row="1" Content="Add" Height="25" Width="50" Click="Button_Click"></Button>
</Grid>
</Window>

现在是代码

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
Settings.Instance.Objects.Add(new ComplexType()
{
Text = "NEW", Type = 4
});
}
}

public class ComplexType
{
public ComplexType()
{
this.TimeStamp = DateTime.Now;
}

public string Text
{
get;
set;
}

public int Type
{
get;
set;
}

public DateTime TimeStamp
{
get;
set;
}
}

public class ComplexTypeToMenuItemConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var values = value as IEnumerable<ComplexType>;

if (values == null)
{
return new List<MenuItem>
{
new MenuItem
{
Header = "Unknown Value"
}
};
}

IList<MenuItem> items = new List<MenuItem>();

foreach (ComplexType obj in values)
{
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri("1.png", UriKind.Relative);
bitmap.EndInit();

Image image = new Image();
image.Width = 16;
image.Source = bitmap;

MenuItem menuItem = new MenuItem();
menuItem.Header = string.Format("{0} - {1}", obj.Text, obj.TimeStamp.ToShortTimeString());
menuItem.Icon = image;

items.Add(menuItem);
}

return items;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

public class Settings
{
private static readonly Settings settings = new Settings();

private Settings()
{
this.Objects = new ObservableCollection<ComplexType>
{
new ComplexType
{
Text = "Item #1",
Type = 1
}
};
}

public static Settings Instance
{
get
{
return settings;
}
}

public ObservableCollection<ComplexType> Objects
{
get;
private set;
}
}

任何帮助将不胜感激!

最佳答案

您将 ObservableCollection 变成一个 List,它不再提供更新,因此出现了问题。通常,您希望避免在 ItemsSource 绑定(bind)中使用转换器。

不要使用转换器来做这种事情,使用Data Templating .

关于c# - 使用转换器将 WPF ContextMenu 绑定(bind)到 ObservableCollection 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com