显示所选菜单项

时间:2014-03-14 23:35:30

标签: c# .net wpf menu menuitem

HY,

我有一个包含一些菜单项的菜单。我有各种其他元素,如树视图和一些控件。当我打开程序时,菜单中的所有元素都可用。但我要做的第一步是连接到服务器。因此,在通过连接菜单项建立连接之前,所有其他元素都不可用。

然后我想仅显示菜单项,如果选择特殊树视图(例如整个项目结构)项目,例如所有主题。例如,如果单击菜单中的树视图条目,则应该有特殊的菜单项。

是否可以在xaml中完成此操作?

UPDATE1:

MainWindow.xaml

Title="Service Bus Visualizer" Height="680" Width="1200" Name="Root"
<MenuItem Header="_Read File" Name="readFile" Click="MenuItemReadFile" HorizontalAlignment="Right" Width="187" IsEnabled="{Binding Path=DataContext.IsMonitoring, ElementName=Root}">
    <MenuItem.Icon>
        <Image Source="Icons/Open.ico" Width="16" Height="16" />
    </MenuItem.Icon>
</MenuItem>

MainWindow.xaml.cs

public bool IsMonitoring
{
    get
    {
        return isMonitoring;
    }
    set
    {
        isMonitoring = value;
        RaisePropertyChanged("IsMonitoring");
    }
}

private bool isMonitoring;
public MainWindow()
{
    InitializeComponent();
    this.IsMonitoring = false;
    this.DataContext = this;
    Application.Current.MainWindow = this;
}

public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string name)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

ConnectionWindow.xaml.cs

MainWindow mainWindow = Application.Current.MainWindow as MainWindow;
mainWindow.IsMonitoring = true;

我在输出窗口没有错误但它不起作用?

UPDATE2:

我有第二个参数,它是一个ObservableCollection。

MainWindow.xaml

<ListBox Grid.Row="3" Name="Logger" ItemsSource="{Binding Path=DataContext.LoggingList, ElementName=Root}" DisplayMemberPath="Message" IsSynchronizedWithCurrentItem="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="BringSelectionIntoView">
</ListBox>

MainWindow.xaml.cs

public static ObservableCollection<Log> LoggingList { get; set; }

public MainWindow()
{
    LoggingList = new ThreadSafeObservableCollection<Log>();
    this.IsMonitoring = false;
    this.DataContext = this;
    Application.Current.MainWindow = this;
    InitializeComponent();
}

Log.cs

public class Log : INotifyPropertyChanged
{
    public string Message {
        get
        {
            return message;
        }
        set
        {
            message = value;
            NotifyPropertyChanged("Message");
        }
    }
    public string message;

    public Log()
    {
    }

    public Log(string message)
    {
        this.Message = message;
        NotifyPropertyChanged("Message");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }        
}

祝你好运

1 个答案:

答案 0 :(得分:1)

首先,你有两个选择&#34;可用性&#34;被关注到。 &#34; IsEnabled&#34;财产,&#34;可见&#34;属性。 &#34;的IsEnabled&#34;是一个bool,并确定用户是否可以单击/选择/与给定元素交互。一般来说,如果此属性设置为false,则元素将显示为#34;灰色&#34;。

更改可见性将使元素完全显示/消失。设置为&#34;可见&#34; (这实际上是一个枚举),它通常显示。当设置为&#34;隐藏&#34;时,它的空间在UI上保留,但您实际上无法看到它。设置为&#34; Collapsed&#34;您无法看到它,并且在布局中没有为它预留空间。

对于你的第一个要求(等待连接到服务器),我会使用IsEnabled绑定到&#34; IsConnected&#34;财产如此:

IsEnabled="{Binding IsConnected}"

这将会发生需要具有此行为的每个项目。

&#34;特定于上下文&#34;菜单项有点复杂,但基本的想法是对Visible的每个上下文敏感项的绑定,如:

Visible="{Binding Path=SelectedItem, ElementName=MyTreeView, Converter={StaticResource SelectedItemToVisibilityConverter}, ConverterParameter={x:Type ChildItem}"

我假设每个项目的可见性取决于选择的项目类型(子项或父项),如果我错了,您应该能够扩展示例。然后转换器看起来像:

public class SelectedItemToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((parameter as Type).IsInstanceOfType(value))
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(...)
    {
         return Binding.DoNothing;
    }
}

如果我能澄清任何事情,请告诉我。希望这能为你提供一个很好的起点。

<强>更新

查看您的代码,我发现了一些潜在的问题:

  1. IsMonitoring被声明为公共字段。绑定仅适用于公共属性。此属性需要引发PropertyChanged事件才能生效。
  2. 在&#34; MainWindow.xaml.cs&#34;您正在多次设置DataContext。这不是DataContext在WPF中的工作方式。您需要将其设置为一个对象(您的ViewModel),其中包含您有兴趣绑定的所有属性。虽然这被认为是不好的做法,但您可以在构建ViewModel类之前编写this.DataContext = this以使其正常工作。
  3. {&#34>在您的&#34; MainWindow.xaml.cs&#34;中声明IsMonitoring字段文件。首先,这应该在视图模型中。其次,绑定是在MenuItem类上寻找该属性(可能是因为它在某种ItemsControl中)。如果你想在根数据上下文中,给你的窗口一些名字(比如&#34; Root&#34;)并使用以下绑定:

    "{Binding Path=DataContext.IsMonitoring, ElementName=Root}"
    
  4. 希望这是有道理的。如果我能进一步帮助,请告诉我!