【问题标题】:WPF Binding how to get object referenceWPF Binding如何获取对象引用
【发布时间】:2012-11-07 05:54:22
【问题描述】:

我有一个 ListView 显示使用 MVVM 和自定义模板的帐户列表并且工作正常 现在点击Acct Name,我们需要执行一个需要当前Acct对象的自定义操作

有没有办法将 Label.Tag 属性设置为 Acct 对象?

xaml def 如下 env 是 vs2010 .net 4.0 c#

<ListView Name="lv1" Grid.Column="1" Grid.Row="4"
    ItemsSource="{Binding AccountsList}"
    Background="Transparent" BorderThickness="0">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="/asm1;component/Images/Icons/pdf1.png" Width="12" Height="12" />
                <Label Content="{Binding Name}" Margin="0,0,25,0" 
                    ContextMenu="{x:Null}" Name="lblacctItem" 
                    MouseDoubleClick="lbl_MouseDoubleClick" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Background="Transparent" 
                Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" 
                ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}" 
                MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}" 
                ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

【问题讨论】:

  • MouseDoubleClick="lbl_MouseDoubleClick" 不是一个好方法,这里你要在后面的代码中实现业务逻辑,这违反了 MVVM 原则。如果您想坚持 MVVM 模式,请考虑改用命令。

标签: c# .net wpf xaml data-binding


【解决方案1】:

您正在混合使用 MVVM 和代码。

您应该创建一个命令行为 (Link) 来标记。然后你应该将 CommandParameter 绑定到 AccObject,并将 Command 绑定到你需要执行的操作。

以下内容应删除。

MouseDoubleClick="lbl_MouseDoubleClick"

根据 cmets 更新

由于当前项绑定到 AccObject,只需在命令参数中使用 Binding。

CommandParameter = {Binding}

【讨论】:

  • 如何获取AccObject是个问题
【解决方案2】:

您可以将 SelectedItem 属性设置为 viewmodel 的 SelectedAccount 属性。

SelectedItem="{绑定 SelectedAccount}" 背景="透明" BorderThickness="0">

在 SelectedAccount 属性上使用 INotifyPropertyChanged 接口。

谢谢, 拉杰尼坎特

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2013-06-10
    • 2010-10-13
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多