繁体   English   中英

将静态类绑定到ContentControl WPF

[英]Binding static class to contentcontrol wpf

我正在尝试为要在我的应用程序中使用的某些设置制作表格。 因为我不知道如何实现此目标,所以我使用静态类来保存我的设置,因此将在另一页上使用它们。

这是该页面的“视图”,下面是我要使用的静态类。

<UserControl x:Class="Board.PortSettingView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:Board"
         xmlns:sys="clr-namespace:System;assembly=mscorlib"
         xmlns:io="clr-namespace:System.IO.Ports;assembly=System"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="400">

<UserControl.Resources>
    <!-- Enumerations to populate the comboboxes -->
    <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="StopBits">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="io:StopBits" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="Parity">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="io:Parity" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <ObjectDataProvider ObjectType="{x:Type io:SerialPort}" MethodName="GetPortNames" x:Key="portNames"/>

    <!-- Data Template for Settings -->
    <DataTemplate x:Key="Data" DataType="{x:Type local:Data}">
        <Border HorizontalAlignment="Left" VerticalAlignment="Top" Height="Auto" BorderBrush="Black" BorderThickness="1" Padding="5">
            <Grid Width="150" HorizontalAlignment="Left" VerticalAlignment="Top">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>

                <TextBlock Grid.Column="0" Grid.Row="0"  Text="Port" VerticalAlignment="Center" Margin="5" />
                <ComboBox SelectedValue="{Binding Com}" Grid.Row="0" Grid.Column="1" Margin="5" ItemsSource="{Binding Source={StaticResource portNames}}" />

                <TextBlock Grid.Column="0" Grid.Row="1"  Text="Baud Rate" VerticalAlignment="Center" Margin="5" />
                <TextBox Grid.Row="1" Grid.Column="1"  Text="{Binding Baud}" Margin="5" />

                <TextBlock Grid.Column="0" Grid.Row="2"  Text="Data Bits" VerticalAlignment="Center" Margin="5" />
                <TextBox Grid.Row="2" Grid.Column="1"  Text="{Binding DB}" Margin="5" />

                <TextBlock Grid.Column="0" Grid.Row="3"  Text="Stop Bits" VerticalAlignment="Center" Margin="5" />
                <ComboBox SelectedValue="{Binding SB}" Grid.Row="3" Grid.Column="1" Margin="5" ItemsSource="{Binding Source={StaticResource StopBits}}" />

                <TextBlock Grid.Column="0" Grid.Row="4"  Text="Parity" VerticalAlignment="Center" Margin="5" />
                <ComboBox SelectedValue="{Binding Par}" Grid.Row="4" Grid.Column="1" Margin="5" ItemsSource="{Binding  Source={StaticResource Parity}}" />

            </Grid>
        </Border>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <StackPanel>
    <TextBlock Text="Settings" 
               FontWeight="Bold" FontSize="18"
               HorizontalAlignment="Left" VerticalAlignment="Top"
               Margin="10,2"/>
    <ContentControl Margin="10,2" Content="{Binding}" ContentTemplate="{StaticResource Data}" />
    <Button Content="Save"  Command="{Binding Path=SaveSettingsCommand}" HorizontalAlignment="Left" Height="30" Margin="10,4" VerticalAlignment="Top" Width="75" />
    </StackPanel>
</Grid>

static class Data
{
    #region Fields

    // Regular Port settings
    private static string _com = "COM1";
    private static int _baud = 9600;
    private static int _dB = 8;
    private static StopBits _sB = StopBits.One;
    private static Parity _par = Parity.Even;

    // Advanced
    private static int _tO = 500;
    private static int _rBT = 50;

    #endregion // Fields

    #region Properties

    //Settings
    public static string Com
    {
        get { return _com; }
        set { _com = value; }
    }

    public static int Baud
    {
        get { return _baud; }
        set { _baud = value; }
    }

    public static int DB
    {
        get { return _dB; }
        set { _dB = value; }
    }

    public static StopBits SB
    {
        get { return _sB; }
        set { _sB = value; }
    }

    public static Parity Par
    {
        get { return _par; }
        set { _par = value; }
    }

    public static int TO
    {
        get { return _tO; }
        set { _tO = value; }
    }

    public static int RBT
    {
        get { return _rBT; }
        set { _rBT = value; }
    }

    #endregion

}

我的问题是,我在该类中指定的设置当前未显示,并且我不知道如何将数据本身正确绑定到内容控件(这就是为什么现在只将其保留为{Binding}的原因)。 我想我缺少了一些东西,我需要将模板和数据分开,但是我不知道如何/使用哪些标签。

我也想保存设置,但只能按一下按钮。 我读到可以通过在绑定的文本框/组合框上使用“更新”源触发器,然后通过“命令”按钮(当前只是一个空白ICommand)调用更新来实现此目的。 这项工作将在数据模板之外进行还是我需要将按钮移到其中?

谢谢

如果要单向绑定(文本块),可以在绑定表达式中使用x:Static Member

 <TextBlock Text="{Binding Source={x:Static Member=YourNameSpace:Data.Com}}" Grid.Row="0" Grid.Column="1" Margin="5"  />

而且您不能在双向绑定(TextBox)中使用静态类,因为您需要在绑定表达式中使用Path。 但是您可以在静态类中使用Singleton模式,然后可以使用静态绑定(请参阅此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM