gpt4 book ai didi

c# - 将用户控件的子属性直接公开为用户控件的属性

转载 作者:行者123 更新时间:2023-12-03 10:22:47 25 4
gpt4 key购买 nike

在不破坏 MVVM 的情况下,有没有办法在用户控件中公开子控件的某些属性,以便使用它的窗口或其他用户控件可以直接访问这些属性?

例如,我有一个用户控件,它有一个使用 gridviewcolumns、标题设置的 ListView ,并绑定(bind)到一个 View 模型。但是用户控件中的 ListView 已经选择了项目属性,因此我想向主机公开,而不必执行 usercontrol.customListView.property 之类的操作。还是我应该这样做?我想只使用 usercontrol.property,省略 customListView。也许我应该只在返回 ListView 控件属性的用户控件代码中创建属性,我想直接附加到用户控件?

我觉得后一种选择并没有真正破坏 MVVM,因为它们暴露给主机交互,与 View 本身没有真正的关系。任何建议将不胜感激。

编辑:事实上,我真的很想在用户控件上直接有一个 SelectedItem 属性,它不是 ListViewItem 或对象,但实际上包含的数据类型是这样的:

public MyDataType SelectedItem {
get {
return customListView.SelectedItem as MyDataType;
}
}

这在 MVVM 中是允许的吗?因为我看不到如何在 ViewModel 中拥有它,所以它似乎必须在后面的部分类代码中。

最佳答案

当您想将重复的内容放入 UserControl 时,这是很常见的任务。 .最简单的方法是当您没有为 UserControl 创建专门的 ViewModel 时。 , 但有点制作自定义控件(为简单起见,使用 UserControl 构建)。最终结果可能如下所示

<UserControl x:Class="SomeNamespace.SomeUserControl" ...>
...
<TextBlock Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}" ...>
</UserControl>

.
public partial class SomeUserControl : UserControl
{
// simple dependency property to bind to
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(SomeUserControl), new PropertyMetadata());

// has some complicated logic
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(double), typeof(SomeUserControl),
new PropertyMetadata((d, a) => ((SomeUserControl)d).ValueChanged()));
private void ValueChanged()
{
... // do something complicated here
// e.g. create complicated dynamic animation
}

...
}

在包含窗口中使用将如下所示
<l:SomeUserControl Text="Text" Value="{Binding SomeValue}" ... />

如您所见 SomeValue绑定(bind)到 Value并且没有 MVVM 违规。

当然,你可以创建一个合适的 ViewModel如果 View 逻辑很复杂或需要太多绑定(bind),那么允许 ViewModel 直接通信(通过属性/方法)会更容易。

关于c# - 将用户控件的子属性直接公开为用户控件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908751/

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