【问题标题】:Named Xaml Controls are Not Shown in CodeBehindCodeBehind 中未显示命名的 Xaml 控件
【发布时间】:2019-08-16 03:57:45
【问题描述】:

我在 WPF 中使用caliburn.micro。 尽管我将 x:Name 设置为我的元素(在 xaml 中),但我在后面的代码(在我的 ViewModel 中)中看不到元素(按钮、文本框、网格等)。 好像 x:Name 是私有的

例如:

<Button x:Name="mybutton">    
        <StckPanel Orientation="Horizontal">
                <Image Width="30" Source="/Resources/edit.png" />
                <TextBlock Margin="5" FontSize="15" Text="Update"> 
                </TextBlock>
        </StackPanel>
</Button>

【问题讨论】:

  • x:Name 默认创建一个私有成员,你不应该改变它。根据定义,您的视图模型不应访问视图元素。

标签: c# wpf caliburn.micro


【解决方案1】:

X:Name 不会将您的 View Elements 暴露给 ViewModel,事实上,正如 Clemens 正确指出的那样,您不应该尝试从 View Model 访问 View Elements。

如果您打算使用 Caliburn Micro 约定在按钮单击上调用方法(从上面的 xaml),您应该编写一个对应于 x:Name 的方法。例如,

public void mybutton()
{
  // Do something
}

每次单击带有 x:Name mybutton 的按钮时,都会调用 mybutton() method

【讨论】:

    【解决方案2】:

    您无法在 ViewModel 中使用名称访问您的 XAML 元素。您只能在代码隐藏文件中访问您的 XAML 元素。例如,您的 XAML 是 MainWindow.xaml,那么您只能访问 MainWindow.xaml.cs 文件中的 XAML 元素。将 MVVM 模式应用于项目的主要目的是使视图 (xaml) 和业务逻辑 (ViewModel) 松散耦合。阅读有关 MVVM 的更多信息here

    【讨论】:

    • 那你如何从 ViewModel 发送data 到 View 后面的代码?在我的情况下,我使用等待异步方法从 JSON API 获取数据到模型中,但是在 XAML 已经加载并且我无法更新它的命名元素的绑定数据之后,数据会到达我的模型(实际上是对象),因为名称不可用.
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多