我需要将位于辅助窗口中的文本框的text属性绑定到在该辅助窗口的相应视图模型中定义的属性
XAML代码:
<Window x:Class="RG.IOManager.Views.PreferencesDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:genericClasses="clr-namespace:RG.IOManager.GenericClasses"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
Title="Setup" Height="131" Width="332"
WindowStartupLocation="CenterOwner"
ShowInTaskbar="False"
WindowStyle="ToolWindow"
>
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../ResourceDictionary.xaml" />
<ResourceDictionary Source="../ScrollBarTemplate.xaml" />
<ResourceDictionary Source="../Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Cycle Time" Grid.Row="0" Grid.Column="0" Height="28" HorizontalAlignment="Left" Margin="10,10,0,20" Name="label1" VerticalAlignment="Top" />
<StackPanel Grid.Row="0" Grid.Column="1" Width="190" Orientation="Horizontal">
<!--
<xctk:IntegerUpDown Name="TbMainCycleTime" Margin="10,10,0,20" Width="50" Height="25" HorizontalContentAlignment="Right"
Increment="1" Maximum="5000" Minimum="0" ShowButtonSpinner="False"/>
-->
<TextBox Name="TbMainCycleTime" Margin="10,10,0,20" Width="50" Height="25" HorizontalContentAlignment="Right" Validation.ErrorTemplate="{StaticResource ErrorTemplate}" Style="{StaticResource textBoxErrorTooltip}" >
<TextBox.Text>
<Binding Source="PreferencesDialog" Path="CycleTime" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<genericClasses:IntegersValidation Min="0" Max="1000" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<!--<TextBox Name="TbMainCycleTime" Margin="10,10,0,20" Width="50" Height="25" HorizontalContentAlignment="Right" />-->
<Label Content="ms" Margin="1,10,10,20"/>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Width="190" Orientation="Horizontal">
<Button Content="Update" Height="23" HorizontalAlignment="Left" Margin="5,0,10,0" Name="btUpdate" VerticalAlignment="Top" Width="75" Click="btUpdate_Click" />
<Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="5,0,10,0" Name="btCancel" VerticalAlignment="Top" Width="75" Click="btCancel_Click" />
</StackPanel>
</Grid>
/// <summary>
/// Interaction logic for PreferencesDialogue.xaml
/// </summary>
public partial class PreferencesDialog : Window, INotifyPropertyChanged
{
#region Binding Properties
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Main cycle time
/// </summary>
public int CycleTime
{
get { return _CycleTime; }
set
{
_CycleTime = value;
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs("CycleTime"));
}
}
}
private int _CycleTime;
#endregion
private IOManager _receiver;
public PreferencesDialog(IOManager receiver)
{
this._receiver = receiver;
InitializeComponent();
//this.TbMainCycleTime.Text = _receiver.globalBindingProperties.MainCycleTime.ToString();
this.CycleTime = _receiver.globalBindingProperties.MainCycleTime;
}
private void btUpdate_Click(object sender, RoutedEventArgs e)
{
_receiver.globalBindingProperties.MainCycleTime = Convert.ToInt32(this.TbMainCycleTime.Text);
this.Close();
}
private void btCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
有人能帮助我找到我做错的事吗?提前致谢
答案 0 :(得分:0)
您是否已将viewmodel指定为窗口的datacontext? (已定义CycleTime的类)
其次,您是否要更改UI的循环时间。您正在使用TextBox和CycleTime属性之间的双向绑定。
检查这是link,我在哪里创建了类型安全文本框扩展名。虽然文章是关于silverlight的,但你可以在WPF中轻松使用。
将您的xaml更改为
<Window x:Class="RG.IOManager.Views.PreferencesDialog" x:Name="PreferencesDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
答案 1 :(得分:0)
你的做法是错误的。但是,如果你改变这两件事,你的问题就会得到解决:
首先设置Window的DataContext:
public PreferencesDialog(IOManager receiver)
{
this.DataContext = this;
this._receiver = receiver;
InitializeComponent();
//this.TbMainCycleTime.Text = _receiver.globalBindingProperties.MainCycleTime.ToString();
this.CycleTime = _receiver.globalBindingProperties.MainCycleTime;
}
第二个从TextBox.Text.Binding中删除'Source',因为source是dataContext。
<TextBox Name="TbMainCycleTime" Margin="10,10,0,20" Width="50" Height="25" HorizontalContentAlignment="Right" Validation.ErrorTemplate="{StaticResource ErrorTemplate}" Style="{StaticResource textBoxErrorTooltip}" >
<TextBox.Text>
<Binding Path="CycleTime" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<genericClasses:IntegersValidation Min="0" Max="1000" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>