【问题标题】:Update UserControl when parent item is changed更改父项时更新 UserControl
【发布时间】:2020-03-02 17:12:58
【问题描述】:

处理以下情况的正确方法(MVVM)是什么?我们有一个窗口/用户控件,它承载了很少的用户控件和网格。当我们选择网格项时,SelectedItem="{Binding SelectedAccount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 正在更新用户控件上的SelectedAccount 属性

<TabItem Header="{x:Static p:Resources.Basic}">
    <DockPanel>
       <accounts:UCBasic x:Name="UCBasic" SelectedAccount="{Binding SelectedItem, ElementName=gridMain}"></accounts:UCBasic>
    </DockPanel>
</TabItem>
    <TabItem Header="{x:Static p:Resources.AdditionalData}">
    <DockPanel>
          <accounts:UCAdditionalData x:Name="UCAdditionalData" SelectedAccount="{Binding SelectedItem, ElementName=gridMain}"></accounts:UCAdditionalData >
    </DockPanel>
    ... more user controls ...
</TabItem>

使用他们的DependencyProperty。现在,我将如何为上述用户控件 (UCBasic, UCAdditionalData) 编写 PageModel,以便他们可以根据来自网格的SelectedAccount 加载/显示更多数据。有使用属性更改事件的肮脏方式,但我认为不应该这样做。每个用户控件都有这个:

public Account SelectedAccount
{
    get { return (Account)GetValue(SelectedAccountProp); }
    set
    {
        SetValue(SelectedAccountProp, value);
    }
}
public static readonly DependencyProperty SelectedAccountProp = DependencyProperty.Register("SelectedAccount", typeof(Account), typeof(UCBasic));

本质上,我将如何通知此用户控件 SelectedAccount 值已更改并且它应该自行更新(它自己的文本框、网格等)?

【问题讨论】:

  • 您是说您的SelectedAccount 不起作用吗?因为如果是这样,您应该能够绑定到UserControl 中的SelectedAccount 的属性。或者在属性更改回调中做一些事情。

标签: c# wpf


【解决方案1】:

如果每个用户控件都有Account属性,它可以在自己的文本框、网格等中进行绑定,例如

<TextBox Text="{Binding Account.Name, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

【讨论】:

    【解决方案2】:

    1) 您可以在 ViewModel 中使用 INotifyPropertyChanged 实现(如果将发送通知以更新 View 上更改的 ViewModel 属性) 2) 如果您对两个用户控件都使用一个 ViewModel,则 1 选项应该会立即为您提供帮助。 如果您使用不同的 ViewModel,您应该在更新第一个用户控件时更新代码中的第二个用户控件视图模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2023-02-02
      • 2021-12-09
      相关资源
      最近更新 更多