簡體   English   中英

如何使用Xaml中啟動的同一對象在代碼背后創建數據綁定?

[英]How to create databinding in code behind using the same object that is initiated in xaml?

我有以下代碼:

    <Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication3" xmlns:oxy="http://oxyplot.org/wpf"
        xmlns:vm="clr-namespace:ViewModel;assembly=ViewModel"
        Background="#FFDEDEDE" 
        WindowStyle="None"
        AllowsTransparency="True"
       WindowStartupLocation="CenterScreen"

    mc:Ignorable="d"
        Title="Compression Test" Height="1080" Width="1920">


    <Window.Resources>
        <vm:MainViewModel x:Key="vmMain"
         sampleCount="100" />
    </Window.Resources>
    <Grid x:Name="gridUI">

        <StackPanel Orientation="Vertical">
            <StackPanel Height="100">

                <Border Background="#FF8986D3" Height="100" Margin="0,0,0,30" >

                    <TextBlock Text="COMPRESSION TEST"  FontFamily="Sans-serif" FontSize="30" Foreground="#FFF9F9F9" VerticalAlignment="Center" FontWeight="Medium" HorizontalAlignment="Center"/>

                </Border>

            </StackPanel>

            <StackPanel Orientation="Horizontal" Height="auto">
                <Border BorderBrush="White" BorderThickness="2" >
                <StackPanel Orientation="Vertical" Width="200" Height="1080">


                    <Label  FontSize="24" FontFamily="Sans-serif" FontWeight="Medium" Name="doc" Foreground="White" Background="#FFA39AD8" Width="200" HorizontalContentAlignment="Center" Height="43">Files</Label>
                    <Border BorderBrush="#FFD4D4D4" BorderThickness="0.5" Grid.Row="3"></Border>


                    <StackPanel Name="sp_doc" Margin="0,10,0,0" >
                        <StackPanel Orientation="Horizontal"  Name="sp_sample_button" Grid.Row="0" Grid.Column="0">
                            <Image Source="pack://application:,,,/Resources/413.png" Height="40" Width="40"  UseLayoutRounding="True"   MouseDown="sampleDropDown" Cursor="Hand" Margin="5,0,0,0" Name="up_arrow"/>
                            <Image Source="pack://application:,,,/Resources/412.png" Height="40" Width="40"  UseLayoutRounding="True"   MouseDown="sampleDropDown" Cursor="Hand" Margin="5,0,0,0" Name="down_arrow" Visibility="Collapsed"/>
                            <!--<Button x:Name="sss" Click="sampleDropDown">s</Button>-->
                            <Label FontSize="18" FontFamily="Sans-serif" FontWeight="Light" Name="sam" Foreground="White" Margin="10">Samples</Label>

                        </StackPanel>
                        <StackPanel Orientation="Vertical" Name="sp_s">

                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="1">
                            <Image Source="pack://application:,,,/Resources/413.png" Height="40" Width="40"  UseLayoutRounding="True"  RenderTransformOrigin="-0.,0.558" MouseDown="reportDropDown" Cursor="Hand" Margin="5,0,0,0" Name="up_arrow1"/>
                            <Image Source="pack://application:,,,/Resources/412.png" Height="40" Width="40"  UseLayoutRounding="True"  Cursor="Hand" Margin="5,0,0,0" Name="down_arrow1" Visibility="Collapsed" MouseDown="reportDropDown"/>
                            <!--<Button Click="reportDropDown">r</Button>-->
                            <Label FontFamily="Sans-serif" FontWeight="Light" Foreground="White" FontSize="18" Margin="10">Reports</Label>
                        </StackPanel>
                        <StackPanel Orientation="Vertical" Name="sp_r">

                        </StackPanel>

                    </StackPanel>




                </StackPanel>
                </Border>
                <StackPanel Width="1781">
                    <StackPanel Orientation="Horizontal" Background="#FFFDFDFD" Height="111">
                        <TextBox Name="sampleCount" Text="{Binding sampleCount, Source={StaticResource vmMain}, UpdateSourceTrigger=PropertyChanged}" Width="200"></TextBox>
                        <Button Cursor="Hand"  Height="75" Width="75" Style="{StaticResource CircleButton}"  FontFamily="Sans-Serif" FontSize="25" Foreground="White" Click="NewSample_Click" Content="+" Margin="20,0,0,0" Background="#FFACAABF" />

                        <StackPanel Margin="20,19,0,0">
                            <Image Source="pack://application:,,,/Resources/file512.png" Height="75" Width="75"  UseLayoutRounding="True" Margin="0,0,0,0"  MouseDown="CreateReport_Click" Cursor="Hand" SnapsToDevicePixels="True"/>
                        </StackPanel>

                        <Image Source="pack://application:,,,/Resources/play1.png" Height="75" Width="75"  UseLayoutRounding="True" Margin="20,18,0,18"  MouseDown="CreateReport_Click" Cursor="Hand" SnapsToDevicePixels="True"/>

                        <Image Source="pack://application:,,,/Resources/1131.png" Height="75" Width="75"  UseLayoutRounding="True" Margin="1340,0,0,0"  MouseDown="CreateReport_Click" Cursor="Hand"/>

                    </StackPanel>
                    <Frame x:Name="newSampleFrame" Content="" HorizontalAlignment="center" VerticalAlignment="center" Width="934" Height="456" NavigationUIVisibility="Hidden" RenderTransformOrigin="0.408,0.5" Visibility="Collapsed"/>
                    <Frame x:Name="reportFrame"  Content=""  HorizontalAlignment="Center" Height="842" VerticalAlignment="Center" Width="595" Margin="0,100,0,0" NavigationUIVisibility="Hidden"/>
                    <Frame x:Name="graphFrame"  Content="" HorizontalAlignment="Center" Height="456"  VerticalAlignment="Center" Width="934" NavigationUIVisibility="Hidden" Visibility="Collapsed"/>
                </StackPanel>


            </StackPanel>
        </StackPanel>

    </Grid>
</Window>

MainViewModel.cs:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ViewModel
{

public class MainViewModel : ObservableObject
{

    public MainViewModel()
    {

    }
    private string[]  sampleName;
    private string _sampleCount;
    public Data obj2 = new Data();



    public string this[int pos]
    {
        get
        {
            return sampleName[pos];
        }

        set
        {
            sampleName[pos] = value;

        }

    }

   public string sampleCount
    {

        get
        {
            return _sampleCount;

        }
        set
        {
            if (value != _sampleCount)
            {

                _sampleCount = value;
                OnPropertyChanged("sampleCount");
                Console.WriteLine("Test");
                Console.WriteLine(value);
                obj2.sampleCount = value;
                SaveFile.saveFileMain(obj2);

            }
        }
    }

} 
}

我有以下代碼,每當我單擊“確定”按鈕時,都會創建一個文本塊:

window2.xaml.cs:

private void Ok_Click(object sender, MouseButtonEventArgs e)
    {
        MainWindow win = (MainWindow)Application.Current.MainWindow;
        int i = 1;  // counter for the name of each new textblock
        string name = String.Concat("sample", i);

        // add textblok to the document list of new samples

        if (File_name.Text != "")
        {
            TextBlock sampleText = new TextBlock();


            sampleText.Text = File_name.Text;
            sampleText.FontSize = 14;
            sampleText.FontFamily = new FontFamily("Sans-serif");
            sampleText.FontWeight = FontWeights.DemiBold;
            sampleText.Margin = new Thickness(20,0,0,0);
            sampleText.Name = name;
            sampleText.PreviewMouseDown += new MouseButtonEventHandler(test1);
            sampleText.Visibility = System.Windows.Visibility.Collapsed;

            //binding 

            Binding myBinding = new Binding();
            myBinding.Source =
            myBinding.Path = new PropertyPath("sampleName");
            myBinding.Mode = BindingMode.TwoWay;
            myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            sampleText.SetBinding(TextBlock.TextProperty, myBinding);


            Grid.SetColumn(sampleText, 0);

            win.sp_s.Children.Add(sampleText);

            // checking if the drop down of sample is already open, if so it will show the last textblock with pressing the arrow button.
            var textblockSample = win.sp_s.Children.OfType<TextBlock>().FirstOrDefault();
            if (textblockSample.Visibility == System.Windows.Visibility.Visible)
            {
                sampleText.Visibility = System.Windows.Visibility.Visible;
            }
        }
        i += 1;  // increasing the loop of names by 1
        this.Close();
    }

是否可以使用在xaml(vmMain)中啟動的同一對象作為將文本塊(示例文本)綁定到sampleName屬性的源?

不知道為什么不將MainWindow DataContext設置為MainViewModel

<Window.DataContext>
    <StaticResourceExtension ResourceKey="vmMain" />
</Window.DataContext>

或者,您甚至可以通過背后的MainWindow代碼設置DataContext ,您似乎並不想保持它不變。

然后設置綁定源:

myBinding.Source = this.DataContext;

如果您拒絕設置DataContext,您仍然可以:

myBinding.Source = this.FindResource("vmMain") as MainViewModel;

不知道我是否能解決您的問題。

編輯

我剛剛意識到您的綁定位於window2 你應該做這個:

myBinding.Source = win.DataContext;

同樣, myBinding.Source = this.FindResource("vmMain") as MainViewModel; 還應myBinding.Source = win.FindResource("vmMain") as MainViewModel;更改為myBinding.Source = win.FindResource("vmMain") as MainViewModel;

如果您仍然擁有MainWindow win = (MainWindow)Application.Current.MainWindow; 行在那里。

我相信您正在尋找的是資源屬性:

myBinding.Source = Resources["vmMain"];

Resource允許您訪問當前對象(窗口)的XAML定義的(或其他)資源。 您也可以以相同方式訪問任何FrameworkElement的資源。


編輯:我沒有注意到vmMain在另一個類中的事實。 考慮到這一點,沒有辦法直接從Window2引用該對象,因為可能有多個MainWindow所以您必須選擇vmMain應該從哪個MainWindow實例獲取。 但是,您可以做的是在Application對象(App.xaml)中創建vmMain 然后,它將在應用程序中的所有FrameworkElement共享該對象。 要訪問它,您可以使用

myBinding.Source = Application.Currennt.Resources["vmMain"];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM