7

我很好奇,因为我正在学习更多关于与 WPF 绑定的知识,你必须设置数据上下文来简单地设置单个属性的 {binding path=} 吗?我只是好奇,因为我正在从背后的代码的 MVVM 示例中学习,看来我有一种情况我想绑定到不在 ViewModel 的数据上下文中的东西,我更喜欢中间类而不是背后的代码来引用捆绑。那么我可以为第二个数据上下文或类似的东西引用另一个类吗?或者我可以设置一个资源键并以某种方式引用该类吗?如果可能的话,我最终想访问一个单独的类中的属性。

例如:

<Window x:Class="WPFTestBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:da="clr-namespace:WPFTestBinding.DataAccess"
        xmlns:main="clr-namespace:WPFTestBinding"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Label Content="Here we go: "/>
            <TextBox x:Name="testtext" />
            <Label Height="50" />
            <!-- CODE BELOW WILL NOT WORK -->
            <TextBox Text="{Binding Path=TestID}" x:Name="testtext2" />
        </StackPanel>
    </Grid>
</Window>

我知道我可以在后面的代码中设置 TextBox 的值,它适用于属性示例,但不适用于绑定。有没有办法对类的属性进行简单的绑定?我还没有找到一个简单的例子,我在网上搜索,在学习绑定时,大多数例子要么是非常密集的设置数据上下文集,要么是非常简单的静态资源示例。我只是好奇你是否可以使用 {Binding Path=} 并动态扩展其他一些属性来获取类中的代码。

其余代码非常简单:

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

 public partial class MainWindow : Window
    {    
        public MainWindow()
        {
           InitializeComponent();

           DataAccess.Test t = new Test();

           testtext.Text = t.TestID;  // code behind works easily
         }
    }
4

4 回答 4

11

您可以像这样在 Xaml 中设置 DataContext:

<Window xmlns:da="clr-namespace:WPFTestBinding.DataAccess">
    <Window.DataContext>
        <da:Test/>
    <Window.DataContext>

    <TextBox Text="{Binding TestID}"/>
</Window>
于 2013-01-07T06:04:29.663 回答
8

需要注意的几点:

  • 您尝试绑定的属性TestID是只读的,因为它只有 get-accessor。因此,Binding应该是OneWay唯一的。
  • 分配 DataContext:您可以分配持有模型的实例,例如 MainViewModel 与 ICollection<BaseViewModel> 属性(这将具有集合中的所有派生实例)或直接分配模型本身(如您的情况)。正如我在下面的代码中所做的那样。

代码

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

public partial class MainWindow : Window
{    
    public MainWindow()
    {
       InitializeComponent();

       DataAccess.Test testInstance = new Test();
       this.DataContext = testInstance;
    }
}

XAML

<TextBox Text="{Binding Path=TestID, Mode=OneWay}" x:Name="txtTestID" />

更多参考:

于 2013-01-07T06:21:11.313 回答
6

未设置数据上下文。DataBinding 不知道从哪里获取 TestID。下面是正确的代码:

namespace WPFTestBinding.DataAccess
{
    class Test
    {
        public string TestID { get { return "This is my test"; } }
    }
}

public partial class MainWindow : Window
{    
    public MainWindow()
    {
       InitializeComponent();
       DataAccess.Test t = new Test();

       DataContext = t;           
    }
}
于 2013-01-07T06:00:16.250 回答
0

1 - 您必须在InitializeComponent()之前填充 Prop;在 .cs 类中。

2 - 在窗口标签中使用它:DataContext="{Binding RelativeSource={RelativeSource Self}}"

3 - Label tag : Label Content="{Binding Currency}"

于 2020-05-18T11:15:38.293 回答