【问题标题】:Deleting from unknown ListBoxes ItemsSource从未知的 ListBoxes ItemsSource 中删除
【发布时间】:2019-02-08 16:33:59
【问题描述】:

我有一个带有多个 ListBox 的窗口,每个 ListBox 使用相同的 KeyDown 事件来确定是否为突出显示的条目按下了删除。我需要获得的是对 ListBox 选定绑定源的引用,因此我可以从中删除选定的值,我可以看到该对象:

var sourceObject = box.ItemsSource;

这只是返回绑定到 ListBox 的项目的 IEnumerable 列表。

如何获取绑定的源属性(参考),以便删除基础值?

这是 xaml:

<ListBox x:Name="listTest1" ItemsSource="{Binding AllTest1Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

<ListBox x:Name="listTest2" ItemsSource="{Binding AllTest2Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

<ListBox x:Name="listTest3" ItemsSource="{Binding AllTest3Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

正如您所见,Event 总是相同的,但绑定不同。这就是为什么我需要找到一种方法来获取对“ListBox_KeyDown”事件处理程序中的绑定的引用。

【问题讨论】:

  • 如果您的代码中为列表框对象设置“绑定源”的部分,我会很有帮助。对于 WPF,这可以通过许多不同的方式完成,因此在某些方面很难弄清楚什么对你有用。你能显示那个代码吗?
  • 谢谢,我更新了问题。
  • 本问题与wcf无关,请修复标签。每个列表框都应该有自己的事件处理程序,因此您要查找的引用只是sender 对象。但请不要使用此引用直接从ItemsSource 中删除任何内容,请改用正确的 MVVM。
  • 感谢您的关注,已将 c 更改为 p。我很想使用正确的 MVVM,但目前我正在从 winforms 过渡,所以我在这里混合。发送者是ListBox,我这里需要的是ListBox的绑定属性的引用。我需要引用绑定到 ListBox 的原始 OberservableCollection,我只是不知道 ListBox 是什么,直到事件触发,所以此时我需要获取对实际 ItemsSource 的引用。
  • 试图在 WPF 中模拟 Winforms 肯定会导致灾难。您的原始ObservableCollection&lt;string&gt; 在您的视图模型中,因此您可以随时参考它。

标签: c# wpf binding


【解决方案1】:

一般来说,您需要数据上下文。

// {Event} needs to be replaced with your event name, such as Click
// {BindingClass} need to be replaced with the name of your binding class, such as ListBoxItems

private void ListBox_{Event}(object sender, RoutedEventArgs e)
{
    var listbox = (FrameworkElement)sender;
    var dataContext = ({BindingClass})listbox.DataContext;
}

上面,您的事件处理程序将提供发送者,如果那是FrameworkElement,您应该能够转换它并获得一个列表框对象。从那里,您可以检查 DataContext 属性并将其转换为您的绑定类。

另一种设计是对 ListBox 组件进行子类化,并添加您自己的属性来以对您最有用的方式表达绑定源。这样,您就可以在通用事件处理程序中访问该属性,而不必担心尝试使用反射或其他方法来确定绑定源对象是什么...

【讨论】:

  • 感谢您的回答,不幸的是,演员表部分是问题所在,因为它是所有列表框的通用事件处理程序,它不知道应该使用哪个 BindingClass,因为每个列表框都有不同的绑定财产。我真正不想要的是每个列表框的事件,因为它们都需要相同的功能,只是不同的绑定属性。
  • 您可以强制转换为对象,然后在 switch 语句中使用 ListBox 名称来确定要引用哪个绑定源;此外,listbox.DataContext.GetType().ToString() 可能会帮助您确定配置该列表框对象实例时使用的数据上下文的类。
【解决方案2】:

如何获取绑定的源属性(参考),以便删除基础值?

box.ItemsSource 确实为您提供了对源集合的引用。但是由于ItemsSource 属性的类型是IEnumerable,因此您需要将值转换为支持删除项目的内容,然后才能删除任何项目。 ICollection&lt;T&gt; 接口应该可以工作。例如,List&lt;T&gt;ObservableCollection&lt;T&gt; 都实现了它。

var x = box.ItemsSource as ICollection<string>;
if (x != null)
    x.Remove("...");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多