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));
}
}
祝你好运
答案 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;
}
}
如果我能澄清任何事情,请告诉我。希望这能为你提供一个很好的起点。
<强>更新强>
查看您的代码,我发现了一些潜在的问题:
IsMonitoring
被声明为公共字段。绑定仅适用于公共属性。此属性需要引发PropertyChanged
事件才能生效。this.DataContext = this
以使其正常工作。 {&#34>在您的&#34; MainWindow.xaml.cs&#34;中声明IsMonitoring
字段文件。首先,这应该在视图模型中。其次,绑定是在MenuItem
类上寻找该属性(可能是因为它在某种ItemsControl中)。如果你想在根数据上下文中,给你的窗口一些名字(比如&#34; Root&#34;)并使用以下绑定:
"{Binding Path=DataContext.IsMonitoring, ElementName=Root}"
希望这是有道理的。如果我能进一步帮助,请告诉我!