直接将属性从类绑定到XAML

时间:2013-01-07 05:37:29

标签: c# wpf mvvm

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

EG:

<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 个答案:

答案 0 :(得分:11)

您可以在Xaml中设置DataContext,如下所示:

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

    <TextBox Text="{Binding TestID}"/>
</Window>

答案 1 :(得分:8)

需要注意的一些要点:

  • 您尝试绑定的属性TestID是只读的,仅限于此 有get-accessor。因此,绑定应仅为OneWay
  • 分配DataContext:您可以使用ICollection&lt; BaseViewModel&gt;分配保存模型的实例,例如MainViewModel。 property(具有集合中的所有派生实例)或直接模型本身(如您的情况)。正如我在下面的代码中所做的那样。

代码

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" />

更多参考:

答案 2 :(得分: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;           
    }
}

答案 3 :(得分:0)

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

2-在Window标记中使用它:DataContext =“ {Binding RelativeSource = {RelativeSource Self}}”

3-标签标签:标签内容=“ {装订货币}”