繁体   English   中英

无法使用数据绑定将对象属性绑定到WPF MenuItem

[英]Unable to tie a Object Property to a WPF MenuItem using Data Binding

选择特定的MenuItem时,我试图设置对象的属性。 例如,如果选择了“开始”菜单项,则该属性应设置为TRUE。 如果选择了其他菜单项(例如“停止”),则该属性应设置为FALSE。 我还设置了一个Command绑定,以在选择MenuItems之一时启动一个单独的窗口。 当选择“开始”菜单项时,命令绑定起作用并启动单独的窗口。 但是,选择“开始”时,该属性不会变为TRUE。

这是我到目前为止的内容:

<Window x:Class="ServerWindows.ServerMenuBar"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:server="clr-namespace:ServerWindows;assembly=ServerWindows"
    Title="Server Window" Height="65" Width="650" MaxWidth="650" MaxHeight="65" MinHeight="65" MinWidth="650" ResizeMode="NoResize">
    <Window.Resources>
        <Style x:Key="ServerStarted" TargetType="MenuItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding server:ServerMenuCommands.ServerStarted}" Value="true">
                    <Setter Property="Tag" Value="true"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="ServerStopped" TargetType="MenuItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding server:ServerMenuCommands.ServerStarted}" Value="false">
                    <Setter Property="Tag" Value="false"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid>
        <MenuItem FontSize="14" Header="Start" Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Style="{StaticResource ServerStarted}"/>
        <MenuItem FontSize="14" Header="Stop" Style="{StaticResource ServerStopped}"/>
    </Grid>
</Window>

类定义在静态类中将data属性与命令绑定结合在一起,如下所示:

public static class ServerMenuCommands
{
    public static bool ServerStarted
    {
        get;
        set;
    }

    public static readonly RoutedUICommand OpenPuttyDisplayCommand = new RoutedUICommand("Open Putty Display", "PUTTY_DISPLAY", typeof(ServerMenuCommands));
}

最后,在命令绑定启动的窗口中完成属性的使用:

if (ServerMenuCommands.ServerStarted)
{
   puttyText.AppendText("\n\rServer STARTED");
   puttyText.ScrollToEnd();
}
else
{
   puttyText.AppendText("\n\rServer STOPPED");
   puttyText.ScrollToEnd();
}

再次。 我只想设置上述属性,这样我就可以通过更新由命令绑定启动的单独窗口来向用户发出对MenuItem“开始”或“停止”的选择的通知。

在此先感谢您的任何帮助。

编辑

好。 在尝试了以下答案以及对以下概述的其他一些调整之后,我无法获得需要的工作。 似乎对我想完成的事情有误解。 我想基于对特定菜单项控件的选择来设置静态对象的属性。 看来我看到的例子反过来起作用。 根据对象的属性(字段)的值设置控件的属性。 这就是为什么我没有在静态类中创建事件的原因。 我不想在任何地方发送PropertyChanged事件。 我想将字段设置为一个值(True或False)。 感谢您为我的问题提供的潜在解决方案。 看来我只是将Click回调分配给Menu Items并以此方式设置对象Property。

编辑:编辑我终于可以根据下面的编辑答案使此工作正常。 对我来说,关键的更改是在XAML中添加命令绑定,然后调用更改静态属性的command方法。 另一个关键是静态事件,并将其绑定到静态属性设置器,然后将其绑定到XAML中的Trigger。 周围一切都很好!

编辑:

我无法对静态类的static属性进行双向(或至少是正确的单向)绑定。 似乎这是不可能的。

我可以提出的唯一方法是使类成为非静态类(以允许其实例化)并使用资源实例绑定到其静态属性:

ServerMenuCommands和代码背后:

public class ServerMenuCommands
{
    public static event EventHandler ServerStartedChanged;

    private static Boolean _ServerStarted;
    public static Boolean ServerStarted
    {
        get
        { 
            return _ServerStarted; 
        }
        set
        {
            if (value != _ServerStarted)
            {
                _ServerStarted = value;

                if (ServerStartedChanged != null)
                    ServerStartedChanged(typeof(ServerMenuCommands), EventArgs.Empty);
            }
        }
    }

    public static readonly RoutedUICommand OpenPuttyDisplayCommand = new RoutedUICommand("Open Putty Display", "PUTTY_DISPLAY", typeof(ServerMenuCommands));
}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        ServerMenuCommands.ServerStarted = !ServerMenuCommands.ServerStarted;
    }
}

XAML:

<Window.CommandBindings>
    <CommandBinding Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<Window.Resources>
    <server:ServerMenuCommands x:Key="serverResource"/>
    <Style x:Key="ServerStarted" TargetType="MenuItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Source={StaticResource serverResource}, Path=ServerStarted}" Value="true">
                <Setter Property="Background" Value="Green"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="ServerStopped" TargetType="MenuItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Source={StaticResource serverResource}, Path=ServerStarted}" Value="false">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <MenuItem Header="Start" Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Style="{StaticResource ServerStarted}"/>
    <MenuItem Grid.Column="1" Header="Stop" Style="{StaticResource ServerStopped}"/>
    <TextBox Grid.Column="2">
        <TextBox.Text>
            <Binding Source="{StaticResource serverResource}" Path="ServerStarted"/>
        </TextBox.Text>
    </TextBox>
</Grid>

这样可以在每次执行OpenPuttyDisplayCommand更改其值(背景)。

暂无
暂无

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

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