【问题标题】:how to get the source instance from event arguments?如何从事件参数中获取源实例?
【发布时间】:2014-01-20 22:25:23
【问题描述】:

假设我们有一个名为 MyClass 的类

public class MyClass
{
      public bool MyProperty {get;set;}
}

我将 MyClass 列表连接到列表视图(DataContex 等)。

为了让 MyClass 项目看起来更漂亮,我在 listView 资源中定义了一个 DataTemplate。

<DataTemplate DataType="x:type local:MyClass">

我为 DataTemplate 中的每一行添加了一个扩展器。我添加了一个事件。

<Expander IsExpanded="Expander_Expanded_Method">

在代码中我有那个方法-

private void Expander_Expanded_Method(object sender, RoutedEventArgs e)
{
  // implement
}

如何获取 MyClass 项的实例以更改其 MyProperty 值?

我试过用:

private void Expander_Expanded_Method(object sender, RoutedEventArgs e)
{
  (sender as MyClass).MyProperty = something; // doesn't work :-(
  (e.Source as MyClass).MyProperty = something // doesn't work :-(
}

我发誓我为这个东西搜索了几个小时,但我没有找到任何线索......

我也尝试过(作为 B 计划)找到一个示例,说明如何通过以下方式将 MyClass 的 MyProperty 从 XAML 更改为

 IsExpanded={binding Path=MyProperty, Mode ="TwoWays"}

但它也不起作用...... 提前致谢

编辑

正如 Sheridan 建议的那样,我将添加更多信息。我会尽量让它变得非常简单:

  • 我有一个 listView ui
  • 和 MyClass 的列表
  • 插入到 listView 中的 MyClass 列表
  • 在每个 MyClass 实例中都有一个 MyOtherClass 列表
  • MyOtherClass 实例也插入到 listView 中
  • 所以 - 我们有一个包含 2 种项目的 listView,MyClass 和 MyOtherClass
  • 在每个 MyClass 中都有一个扩展器(使用 DataTemplate 完成...)
  • 我希望扩展器状态(展开/取消展开)将使当前 MyClass 中的 MyOtherClass 项目可见/折叠

谢谢!

【问题讨论】:

  • 请说明您实际上想要做什么...当Expander 展开时,您想要将您的属性更改为什么值?
  • 嗨。 MyClass 有一个项目列表,这些项目也在同一个列表视图中。每个项目都绑定到 MyProperty 以设置其可见性。我希望当我展开扩展器时,项目会折叠起来。我设法做到了这一切。正如我所提到的,只需要通过扩展器设置 Myproperty 就可以了!谢谢

标签: c# wpf


【解决方案1】:

在 StackOverflow 上提问时,始终最好解释一下您的总体目标是什么。用户经常会问一件事,但不幸的是,他们在试验时经常走错路,实际上并没有提出正确的问题。如果您只想将数据从 Expander.IsExpanded 属性绑定到集合的 Visiblity 属性,那么您可以尝试以下操作:

<DataTemplate DataType="{x:Type local:MyClass}">
    <Expander Name="Expander">
        <ListBox ItemsSource="{Binding YourCollection}">
            <ListBox.Style>
                <Style>
                    <Setter Property="ListBox.Visibility" Value="Visible" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsExpanded, 
ElementName=Expander}" Value="True">
                            <Setter Property="ListBox.Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.Style>
        </ListBox>
    </Expander>
</DataTemplate>

【讨论】:

  • 您好,感谢您的回复 - 由于您的建议,我添加了一个编辑。由于我写的内容,您的回答仍然相关吗? tnx
  • 是的,它仍然是相关的......你试过了吗?
  • 很棒的 tnx,我正在尝试。抱歉耽搁了。只是我在一台计算机上询问并运行其他计算机进行编程...另一台计算机没有互联网。
  • 好的,我试过了,它不起作用。我准确地插入了您的建议。更多信息 - 我将 MyClass 中的 MyOtherClass 列表设置为 ObservableCollection 并在 ItemsSource 中的绑定中设置为:ItemsSource="{Binding Path=MyOtherClassList}" 而 MyOtherClassList 是 MyClass 中的属性名称
  • 我不知道该告诉你什么......你说我希望当我展开扩展器时,项目会折叠。这正是这段代码所做的。尝试将DataTrigger 中的True 更改为False,您应该会看到。 可能您可以在一个新项目中对此进行测试...当您完全理解它时,然后将其重新添加到您当前的项目中。
【解决方案2】:

向 MyClass 添加一个布尔属性 IsExpanded,将扩展器的 IsExpanded 属性绑定到该属性,如果没有,MyClass 应该实现 INotifyPropertyChanged。

public class MyClass
{
      public bool MyProperty {get;set;}
      public bool IsExpanded {get;set;}
      public MyClass()
      {
          PropertyChanged += (s,e) =>
          {
              if (e.PropertyName == "IsExpanded")
                   // change properties
          }
      }
}

<Expander IsExpanded="{Binding IsExpanded}">

【讨论】:

  • 试过了 - 不起作用。我做了 MyClass : INotifyPropertyChanged 并创建了 PropertyChanged 的​​公共事件
【解决方案3】:

我会确保您的 DataTemplate 正确应用于 ListView 的 ItemTemplate。

<ListView ItemsSource="{Binding MyItems}">
    <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type MyClass}">
            <Expander IsExpanded="{Binding MyProperty, Mode=TwoWay}">
                <TextBlock>MyClass instance</TextBlock>
            </Expander>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

【讨论】:

  • tnx 老兄,我会检查一下
猜你喜欢
  • 2021-08-28
  • 2018-01-28
  • 1970-01-01
  • 2018-01-21
  • 2012-06-11
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多