直接将属性从类绑定到XAML

dja*_*azz 7 c# wpf mvvm

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

例如:

<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>
Run Code Online (Sandbox Code Playgroud)

我知道我可以在后面的代码中设置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
         }
    }
Run Code Online (Sandbox Code Playgroud)

小智 11

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

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

    <TextBox Text="{Binding TestID}"/>
</Window>
Run Code Online (Sandbox Code Playgroud)


Har*_*aid 8

有些要点需要注意:

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML

<TextBox Text="{Binding Path=TestID, Mode=OneWay}" x:Name="txtTestID" />
Run Code Online (Sandbox Code Playgroud)

更多参考:


Ser*_*huk 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;           
    }
}
Run Code Online (Sandbox Code Playgroud)